linq - 使用 Linq to Entities (EF4.0) 输入和不输入

标签 linq entity-framework-4 linq-to-entities

这已经毁了我的生活几天了,是时候问了...

我正在为我的应用程序使用 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/

相关文章:

C# LINQ to Entities 无法识别方法 'Boolean'

c# - 在两个对象列表 <T> 中查找共同项目的 'modern' 方法是什么?

entity-framework - 使用 LINQ to Entities 时返回 IQueryable 与 ObjectQuery

c# - 如何构建这个 LINQ 表达式?

asp.net - WCF+ Entity Framework 设计

c# - 是否可以为我的所有对象创建一个通用的 Repository 类?

c# - 使用 Sub Select 而不是 INNER JOIN 的 Entity Framework

entity-framework - 涉及复杂对象的 Entity Framework 的 Linq 表达式构建

c# - 如何使用 LINQ 将 xml 解析为带有 XDocument 的对象

c# - Enumerable.Single 的错误执行?