Linq to entity - 查詢其中 List<string> 屬性至少有一個元素與內存列表中的其他元素匹配的元素

Jdisk Centeno

問題的一些背景

我的數據庫中有一個實體(人),它與另一個(電話)有一對多的關係。

    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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章