Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与Linq to实体(EF4.0)一起使用和不使用_Linq_Entity Framework 4_Linq To Entities - Fatal编程技术网

与Linq to实体(EF4.0)一起使用和不使用

与Linq to实体(EF4.0)一起使用和不使用,linq,entity-framework-4,linq-to-entities,Linq,Entity Framework 4,Linq To Entities,这已经毁了我的生活好几天了,是时候问问 我正在为我的应用程序使用Entity Framework 4.0 一个地点(如房子或办公室)有一个或多个设施(如浴室、卧室、桌球桌等) 我想在位置页面上显示一个复选框列表,其中包含设备的复选框列表,以及该位置当前已选中的设备 我的设施视图模型如下所示 public class FacilityViewItem { public int Id { get; set; } public string Name { get; set; }

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

我正在为我的应用程序使用Entity Framework 4.0

一个地点(如房子或办公室)有一个或多个设施(如浴室、卧室、桌球桌等)

我想在位置页面上显示一个复选框列表,其中包含设备的复选框列表,以及该位置当前已选中的设备

我的设施视图模型如下所示

public class FacilityViewItem
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool Checked { get; set; }
}
因此,当我将位置视图模型传递给UI时,我想传递一个设施列表,其中T是FacilityViewItem类型

var restOfFacilities = ctx
    .Facilities
    .Where(f => !hasFacilities.Contains(f))
    .Select(f => new { f.FacilityId, f.Name })
    .ToList()
    .Select(f => new FacilityViewItem {
        Id = f.FacilityId,
        Name = f.Name
    });

var notFacs = ctx
    .Facilities
    .Where(e => !hasFacilities.Any(m => m.FacilityId == e.FacilityId))
    .Select(e => new { e.FacilityId, e.Name })
    .ToList()
    .Select(e => new FacilityViewItem {
        Id = e.FacilityId,
        Name = e.Name
    });
要获取位置已经拥有的设施非常简单,我使用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未处理 消息=无法创建“Chapter2ConsoleApp.Facility”类型的常量值。在此上下文中仅支持基本类型(“如Int32、String和Guid”)


这里我忽略了什么?

第一个查询似乎很好,但您需要比较
Id
s:

var restOfFacilities = from f in ctx.Facilities
                       where !facs.Select(fac => fac.Id).Contains(f.Id)
                       select f;

具有讽刺意味的是,在经历了几天的痛苦之后,我在这里发布了这个问题,几个小时后就解决了这个问题

错误基本上是说‘我不知道如何通过比较强类型对象来计算哪些项不包括在内。给我一个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
            };

无论如何,我想看看什么是Facility,正如L2E所示,“在这个上下文中只支持基本类型('如Int32、String和Guid'),所以我认为您必须首先检索数据并将其放入FacilityViewItem的集合中

var restOfFacilities = ctx
    .Facilities
    .Where(f => !hasFacilities.Contains(f))
    .Select(f => new { f.FacilityId, f.Name })
    .ToList()
    .Select(f => new FacilityViewItem {
        Id = f.FacilityId,
        Name = f.Name
    });

var notFacs = ctx
    .Facilities
    .Where(e => !hasFacilities.Any(m => m.FacilityId == e.FacilityId))
    .Select(e => new { e.FacilityId, e.Name })
    .ToList()
    .Select(e => new FacilityViewItem {
        Id = e.FacilityId,
        Name = e.Name
    });

希望它有帮助

,它给出了与我已经尝试过的3个查询完全相同的错误……尽管在我对该查询的原始引用中有一个错误!