简体   繁体   English

有没有一种方法可以简化具有多对一关系的Linq查询?

[英]Is there a way to simplify a Linq query with a many to one relationship?

I am using Linq to entities to query a contact record that has 0 to 4 street addresses. 我正在使用Linq实体查询具有0到4个街道地址的联系人记录。 The address that I am trying to get is the address with an address type of "Primary". 我要获取的地址是地址类型为“主要”的地址。 This query gets the information that I want and returns it to an array which is passed out of a JSON method to my front end. 该查询获取我想要的信息,并将其返回到一个数组,该数组从JSON方法传递到我的前端。

 var data = db.Contacts
            .Where(a => a.LastName.Contains(term))
            .Select(r => new
            {
                r.Id,
                value = r.LastName + ", " + r.FirstName + " " + r.MiddleName,
                r.Email,
                r.Title,
                Street1 = c.Addresses
                    .Where(a => a.AddressType.Name.Contains("Primary"))
                    .FirstOrDefault().Street1
                ,
                Street2 = c.Addresses
                    .Where(a => a.AddressType.Name.Contains("Primary"))
                    .FirstOrDefault().Street2
                ,
                City = c.Addresses
                    .Where(a => a.AddressType.Name.Contains("Primary"))
                    .FirstOrDefault().City
                ,
                State = c.Addresses
                    .Where(a => a.AddressType.Name.Contains("Primary"))
                    .FirstOrDefault().State
                ,
                Postal = c.Addresses
                    .Where(a => a.AddressType.Name.Contains("Primary"))
                    .FirstOrDefault().PostalCode
                ,
                r.Institution.Name
            })
            .Take(10).ToArray();

What I am wondering is if there is a way to simplify the portion of the query ** .Where(a => a.AddressType.Name.Contains("Primary"))** so that I don't have the same section repeated each time? 我想知道的是,是否有一种方法可以简化查询的一部分** .Where(a => a.AddressType.Name.Contains(“ Primary”))**,以便没有相同的部分每次重复?

You can use the let keyword: 您可以使用let关键字:

from a in db.Contacts
where a.LastName.Contains(term)
let primaryAddress = a.Addresses
                    .Where(a => a.AddressType.Name.Contains("Primary"))
                    .FirstOrDefault()
select new 
{
    a.Id,
    value = a.LastName + ", " + a.FirstName + " " + a.MiddleName,
    a.Email,
    a.Title,
    Street1 = primaryAddress.Street1,
    Street2 = primaryAddress.Street2,
    City = primaryAddress.City,
    State = primaryAddress.State,
    Postal = primaryAddress.PostalCode,
    a.Institution.Name
})

This is one of those case where I prefer comprehensive syntax to fluent syntax, because it produces much better readable code. 这是我更喜欢综合语法而不是流利语法的情况之一,因为它产生了更好的可读性代码。 Under the hood it is converted to fluent syntax with two Select s: 在后台,它通过两个Select转换为流利的语法:

db.Contacts
    .Where(a => a.LastName.Contains(term))
    .Select(a => 
    new 
    { 
        a = a,
        primaryAddress = 
            a.Addresses
                .FirstOrDefault(a => a.AddressType.Name.Contains("Primary"))
    })
    .Select(a =>
    new 
    {
        a.a.Id,
        value = a.a.LastName + ", " + a.a.FirstName + " " + a.a.MiddleName,
        a.a.Email,
        a.a.Title,
        Street1 = a.primaryAddress.Street1,
        Street2 = a.primaryAddress.Street2,
        City = a.primaryAddress.City,
        State = a.primaryAddress.State,
        Postal = a.primaryAddress.PostalCode,
        a.a.Institution.Name
    })

Take your pick! 随便你!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM