【问题标题】:Nested linq query with contains包含包含的嵌套 linq 查询
【发布时间】:2015-02-06 12:16:00
【问题描述】:

我已经研究了几个小时的 linq 查询,但没有让它工作。

我正在尝试将一些数据列表与另一个数据列表进行比较,但我不明白为什么它没有按预期工作。

我有一个 DbSet,Room 有一个设施列表,每个设施都有自己的 ID。

所以我的方法需要一个设施 ID (IEnumerable) 的列表,我想返回与设施列表匹配的所有房间。

所以我认为我的查询可能如下所示:

var rooms = DbSet.Include("Facility").Where(room => room.Facility.All(facility => facilityIds.Contains(facility.Id)));

但是这个查询给了我比预期的其他结果。谁能帮我解决这个问题?

更新示例

            var filterIds = new int[] {1,2};

            var facilities1 = new List<Facility> {new Facility() {Id = 1}};
            var facilities2 = new List<Facility> {};
            var facilities3 = new List<Facility> {new Facility() {Id = 1}, new Facility() {Id = 2}};

            var basicData = new List<Room>()
            {
                new Room() {Id = 1, Facility = facilities1},
                new Room() {Id = 2, Facility = facilities2},
                new Room() {Id = 3, Facility = facilities1},
                new Room() {Id = 4, Facility = facilities3},
                new Room() {Id = 5, Facility = facilities1},
                new Room() {Id = 6, Facility = facilities1},
            };

            var result = basicData.Where(r => (!filterIds.Any() || r.Facility.All(f => filterIds.Contains(f.Id))));

这个查询给了我 6 个结果,我只期待 ID 为 4 的房间。

【问题讨论】:

  • 您能否创建一个示例来重现您看到的行为,显示预期和实际输出?您可以将DbSet.Include("Facility") 替换为List&lt;Room&gt;
  • 处理该样本

标签: c# linq entity-framework


【解决方案1】:

这行得通吗?

rooms.Where(
   room =>    room.Facilities.Any() 
           && filterIds.All(x => room.Facilities.Any(o => o.Id == x))
);

更新 更新了您的示例数据。返回房间4,如预期的设施1,2。返回房间1,3,4,5,6 仅用于设施1

小提琴:https://dotnetfiddle.net/b24FbF

【讨论】:

    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多