实体框架Linq查询:如何在多个导航属性上从何处选择并从第三个导航属性中选择

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架Linq查询:如何在多个导航属性上从何处选择并从第三个导航属性中选择相关的知识,希望对你有一定的参考价值。

我有以下模型,在Entity Framework Core中设置了nav propertiers:

  • CRMLocations(一对多)CRMPeoples
  • CRMPeoples(一对多)CRME邮件
  • CRMPeoples(一对多)CRMPhones

我有以下工作查询:

        var iqable = _crmDbContext.CRMPeoples
            .Where(p =>
                p.Name.ToLower().Contains(query) ||
                (from e in p.CRMEmails where e.EmailAddress.ToLower().Contains(query) select e).Any() ||
                (from h in p.CRMPhones where h.PhoneNumberNormalized.Contains(query) select h).Any())
            .Select(p => new CRMSearchResultDTO()
            {
                PersonName = p.Name,
                LocationName = p.CRMLocations.Name,
            });

如何替换“(从where where select).Any()”语句来使用Linq的lambda语法?必须导致1个SQL语句。可以使用左外连接或嵌套选择。

答案
var iqable = _crmDbContext.CRMPeoples
        .Where(p =>
            p.Name.ToLower().Contains(query) ||
            p.CRMEmails.Where(e => e.EmailAddress.ToLower().Contains(query)).Any() ||
            p.CRMPhones.Where(h => h.PhoneNumberNormalized.Contains(query)).Any())
        .Select(p => new CRMSearchResultDTO()
        {
            PersonName = p.Name,
            LocationName = p.CRMLocations.Name,
        });

我使用ReSharper的命令“将LINQ转换为方法链”获得此代码

以上是关于实体框架Linq查询:如何在多个导航属性上从何处选择并从第三个导航属性中选择的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 linq 查询 Include() 多个子实体

使用 LINQ 和实体框架在一个 SQL 查询中从多个表中提取数据

当延迟加载禁用时,如何通过实体框架仅将导航属性的特定属性包含到查询中?

PostgreSQL 中具有特定模式的 Linq 和实体迁移

如何查询实体框架中的非映射属性?

添加新导航属性后,实体框架在查询时尝试将属性设置为 null