問題的一些背景:
我的資料庫中有一個物體(人),它與另一個(電話)有一對多的關系。
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。”
謝謝!
uj5u.com熱心網友回復:
如果您為記錄的電話號碼使用標準化格式(即去除所有分隔符并包括標準區號等),那么您可以格式化您的電話號碼搜索串列以符合格式并使用:
.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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/313326.html
上一篇:如何創建一個EF查詢,該查詢根據不同的物體ID回傳具有導航屬性的嵌套串列?
下一篇:EFCore1:1關系?
