假设有商店,客户和信用账户。因此,客户和商店通过信用账户表具有多对多的关系。
如果我希望每个在某个商店都有帐户的客户,我可以像下面这样访问它。
var customers = dbContext.Customers
.Where(c => c.CreditAccounts.Select(a => a.StoreID).Contains(storeID));
这似乎有效,但是当我想通过多个storeIds搜索时,我得到一个空的结果集。以下是我尝试过的一些事情。
var customers = dbContext.Customers
.Where(c => c.CreditAccounts.Any(a => storeIDs.Contains(a.StoreID)));
和
var customers = dbContext.Customers
.Where(c => c.CreditAccounts.Select(a => a.StoreID).Intersect(storeIDs).Count() > 0);
这些总是给我空洞的结果。如何在不编写原始SQL查询的情况下实现此目的?
更新
我没有我认为的数据。一旦纠正,我的查询就开始起作用了。我认为这个问题仍然有效,因为目前尚不清楚这些问题是否表现良好,因此其他用户可能希望以最有效的方式回复结果。
答案 0 :(得分:2)
以下linq查询将返回您要查找的结果 - 但是,我不确定它是否会表现良好:
var results = dbContext.Customers
.Where(c => c.CreditAccounts.Join(storeIds.ToList(), a => a.StoreId, s => s, (a,s)=>s).Any());
您可以通过查找与StoreID相交的信用帐户,然后使用customers表加入信用帐户列表来获得更好的性能 - 尽管我无法从您提供的代码中看出您是否可以直接访问信用帐户列表。