C# 实体框架Linq查询:如何在多个Nav属性上选择位置并从第三个Nav属性中选择

C# 实体框架Linq查询:如何在多个Nav属性上选择位置并从第三个Nav属性中选择,c#,linq,linq-to-sql,entity-framework-core,C#,Linq,Linq To Sql,Entity Framework Core,我在实体框架核心中设置了以下模型和nav属性: CRM位置(一对多)CRM人员 CRMPeoples(一对多)CRMEmails CRM人员(一对多)CRM电话 我有以下工作查询: var iqable = _crmDbContext.CRMPeoples .Where(p => p.Name.ToLower().Contains(query) || (from e in p.CRM

我在实体框架核心中设置了以下模型和nav属性:

  • CRM位置(一对多)CRM人员
  • CRMPeoples(一对多)CRMEmails
  • CRM人员(一对多)CRM电话
我有以下工作查询:

        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 select中的from).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的命令“Convert LINQ to method chain”得到这段代码的。

Oh,伙计,这太直截了当了……)发誓上周生成了大量sql语句。此外,ReSharper还具有“将LINQ转换为方法链”-很好。我最原始的代码是带有左连接的SQL,稍微复杂一点,“将LINQ转换为方法链”将非常有用..还有:代替编写
p.CRMEmails.Where(e=>e.EmailAddress.ToLower().Contains(query)).Any()
您可以编写
p.CRMEmails.Any(e=>e.EmailAddress.ToLower().Contains(query))
(ReSharper建议)Thx,这是我通常写的……不知道我在想什么,也不知道为什么我会有问题。