与包含的嵌套linq查询
问题描述:
我一直在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
答
预计只有房间就这项工作?
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
:
+0
工程就像一个魅力! – ChristiaanV 2015-02-06 12:41:10
你能创建重现您看到的行为的例子,显示预期和实际输出?您可以用'List'代替'DbSet.Include(“Facility”)'。 –
CodeCaster
2015-02-06 12:19:00
使用该样本 – ChristiaanV 2015-02-06 12:20:18