这已经毁了我的生活几天了,是时候问了...
我正在为我的应用程序使用 Entity Framework 4.0。
一个地点(例如房子或办公室)有一个或多个设施(例如浴室、卧室、斯诺克台球 table 等)。
我想在位置页面上显示一个复选框列表,带有一个设施的复选框列表,其中检查了该位置当前拥有的那些。
我的设施 View 模型是这样的......
public class FacilityViewItem
{
public int Id { get; set; }
public string Name { get; set; }
public bool Checked { get; set; }
}
所以当我将位置 View 模型传递给 UI 时,我想传递一个
List<T>
的设施,其中 T 是 FacilityViewItem 类型。要获取该位置已有的设施很简单 - 我使用 Location.Facilities 进行查询,它返回一个 EntityCollection,其中 T 是 Facility 类型。这是因为设施是导航属性....
var facs = from f in location.Facilities
select new FacilityViewItem()
{
Id = f.FacilityId,
Name = f.Name,
Checked = true
};
所以这就是我的问题所在 - 我想要其余的设施,即该位置没有的设施。
我试过使用 Except() 和 Any() 和 Contains() 但我得到了同样的错误。
不起作用的查询示例...
var restOfFacilities = from f in ctx.Facilities
where !hasFacilities.Contains(f)
select new FacilityViewItem()
{
Id = f.FacilityId,
Name = f.Name
};
var restOfFacilities = ctx.Facilities.Except(facilitiesThatLocationHas);
var notFacs = from e in ctx.Facilities
where !hasFacilities.Any(m => m.FacilityId == e.FacilityId)
select new FacilityViewItem()
{
Id = e.FacilityId,
Name = e.Name
};
我在每个实现中遇到的错误......
System.NotSupportedException 未处理
Message=无法创建类型为“Chapter2ConsoleApp.Facility”的常量值。在此上下文中仅支持原始类型(“例如 Int32、String 和 Guid”)。
我在这里俯瞰什么?
最佳答案
具有讽刺意味的是,经过数天的痛苦之后,我在此处发布问题后几个小时内就解决了这个问题。
错误基本上是说'我不知道如何通过比较强类型对象来计算哪些项目不包括在内。给我一个 Int 或一些简单类型的列表,我可以处理它'。
因此,首先您需要获取主键列表,然后在 contains 子句中使用它...
//get the primary key ids...
var hasFacilityIds = from f in hasFacilities
select f.FacilityId;
//now use them in the contains clause...
var restOfFacilities = from f in ctx.Facilities
where !hasFacilityIds.Contains(f.FacilityId)
select new FacilityViewItem()
{
Id = f.FacilityId,
Name = f.Name
};
关于linq - 使用 Linq to Entities (EF4.0) 输入和不输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5405014/