問題的一些背景:
我的數據庫中有一個實體(人),它與另一個(電話)有一對多的關係。
public class Person
{
[Key]
public int Id { get; set; }
.
.
.
[ForeignKey("PersonId")]
public virtual List<Phone> Phones { get; set; }
}
public class Phone
{
[Key]
public int Id { get; set; }
.
.
.
public string PhoneNumber { get; set; }
public int PersonId { get; set; }
public virtual Person Person { get; set; }
}
其次,我收到一個包含字符串列表的過濾器。
問題:
我試圖從數據庫中獲取所有至少有一個 PhoneNumber 匹配(通過喜歡)過濾器的任何電話號碼的人。
到目前為止,我已經嘗試過這個:
var query = _dbContext.Person
.Include(x => x.PhoneNumbers)
.AsNoTracking();
.Where(x => x.Phones
.Any(y => filter.Phones
.Any(z => y.PhoneNumber.Contains(z))));
此查詢引發錯誤:
LINQ 表達式 {my expression here} 無法翻譯。以可翻譯的形式重寫查詢,或通過插入對“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的調用,顯式切換到客戶端評估。有關詳細信息,請參閱https://go.microsoft.com/fwlink/?linkid=2101038。”
謝謝!
如果您為記錄的電話號碼使用標準化格式(即去除所有分隔符並包括標準區號等),那麼您可以格式化您的電話號碼搜索列表以符合格式並使用:
.Where(x => x.Phones.Any(y => filter.Phones.Contains(y.PhoneNumber)));
問題是您不能Any
對內存中集合應用 Linq2Entity 。您可以Contains
對集合使用,但電話號碼必須完全匹配。(所以沒有內部LIKE
類型比較)
如果您有合理數量的搜索電話號碼並且想要LIKE
跨電話號碼進行類型搜索,那麼您可以利用 LinqKit 的 PredicateBuilder 來準備合適的條件。這需要將查詢標記為“可擴展”,以便可以構建動態謂詞。
var query = _dbContext.Person
.Include(x => x.PhoneNumbers)
.AsNoTracking()
.AsExpandable();
if (filter.Phones.Any())
{
var predicate = PredicateBuilder.New<Person>();
foreach(var phone in filter.Phones)
predicate = predicate.Or(x => x.Phones.Any(p => p.Contains(phone)));
query = query.Where(predicate);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句