包含嵌套的 linq 查询
Nested linq query with contains
我已经处理了几个小时的 linq 查询,但没有让它工作。
我正在尝试将一些数据列表与另一个数据列表进行比较,但我不明白为什么它没有按预期工作。
我有一个 DbSet,Room 有一个 Facilities 列表,每个 Facility 都有自己的 ID。
所以我的方法采用 facilityId 的列表 (IEnumerable),我想 return 所有与设施列表匹配的房间。
所以我认为我的查询可能如下所示:
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))
);
更新
使用您的示例数据更新 fiddle。 Returns 房间 4
符合设施 1,2
的预期。 Returns 房间 1,3,4,5,6
仅设施 1
:
Fiddle: https://dotnetfiddle.net/b24FbF
我已经处理了几个小时的 linq 查询,但没有让它工作。
我正在尝试将一些数据列表与另一个数据列表进行比较,但我不明白为什么它没有按预期工作。
我有一个 DbSet,Room 有一个 Facilities 列表,每个 Facility 都有自己的 ID。
所以我的方法采用 facilityId 的列表 (IEnumerable),我想 return 所有与设施列表匹配的房间。
所以我认为我的查询可能如下所示:
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))
);
更新
使用您的示例数据更新 fiddle。 Returns 房间 4
符合设施 1,2
的预期。 Returns 房间 1,3,4,5,6
仅设施 1
:
Fiddle: https://dotnetfiddle.net/b24FbF