2015-02-06 79 views
0

我一直在linq查询几个小时,但没有得到它的工作。与包含的嵌套linq查询

我想比较一些数据列表到另一个数据列表,我不明白为什么它不按预期工作。

我有一个DbSet和Room有一个设施清单,每个设施都有它自己的Id。

所以我的方法采用了facilityId的列表(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

+1

你能创建重现您看到的行为的例子,显示预期和实际输出?您可以用'List '代替'DbSet.Include(“Facility”)'。 – CodeCaster 2015-02-06 12:19:00

+0

使用该样本 – ChristiaanV 2015-02-06 12:20:18

回答

3

预计只有房间就这项工作?

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

+0

工程就像一个魅力! – ChristiaanV 2015-02-06 12:41:10