我正在努力使用linq查询,我需要在集合中查找与另一个集合中的id匹配的项目。
用户可以登录并保存属性搜索,您可以在其中指定是否要搜索公寓,房屋等,以及在哪些区域进行搜索。然后,我们想要显示搜索特定区域等的用户列表。
这是我正在尝试进行搜索的代码:
SearchSetting searchSetting = mySearchSetting;
List<RegionSearch> regionSearchList = myRegionSearchList;
var searches =
SearchSettingsRepository.Instance.Where(s =>
(!searchSetting.Flat || s.Flat == searchSetting.Flat) &&
(!searchSetting.House || s.House == searchSetting.House) &&
(!searchSetting.Castle || s.Castle == searchSetting.Castle),
new[] { "RegionSearches" })
.Where(s => s.RegionSearches.Intersect(regionSearchList)
.Any())
.ToList();
因此,如果myRegionSearchList包含RegionA和RegionB,我想要一个列表,其中包含在SearchSetting.RegionSearches中指定了这两个区域的所有用户。目前,即使我知道有些用户选择了两个区域,上面的结果也会返回零结果。
我们首先使用Entity Framework数据库,并且我们有一个所有存储库都继承的通用存储库,因此上面的搜索调用了这个方法:
public abstract class GenericRepository<TDb, TModel>
where TDb : DbContext, new()
where TModel : class
{
public List<TModel> Where(Expression<Func<TModel, bool>> pred, string[] include = null)
{
List<TModel> items;
using (var db = new TDb())
{
if (include == null)
{
items = db.Set<TModel>().Where(pred).ToList();
}
else
{
DbQuery<TModel> query = null;
foreach (var inc in include)
{
query = db.Set<TModel>().Include(inc);
}
items = query.Select(t => t).Where(pred).ToList();
}
}
return items;
}
}
如果您需要更多信息,请告诉我,我会更新问题。
答案 0 :(得分:1)
我会尝试以下方法:
Where
谓词Intersect
替换为All
/ Any
(我假设RegionSearch
已
ID
唯一标识符)<强>更新强>
List<RegionSearch> regionSearchList = myRegionSearchList;
List<int> regionSearchListIds = regionSearchList.Select(x => x.ID).ToList();
代码示例:
SearchSettingsRepository.Instance.Where(s =>
(!searchSetting.Flat || s.Flat == searchSetting.Flat) &&
(!searchSetting.House || s.House == searchSetting.House) &&
(!searchSetting.Castle || s.Castle == searchSetting.Castle) &&
regionSearchListIds.All(r => s.RegionSearches.Any(x => x.ID == r)),
new[] { "RegionSearches" });