Есть ли способ упростить запрос Linq с отношением много к одному?

1

Я использую Linq для сущностей для запроса записи контакта, которая имеет от 0 до 4 адресов улицы. Адрес, который я пытаюсь получить, - это адрес с типом адреса "Первичный". Этот запрос получает информацию, которую я хочу, и возвращает ее в массив, который передается из метода 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();

Мне интересно, если есть способ упростить часть запроса **.Where(a => a.AddressType.Name.Contains("Первичный")) **, чтобы у меня не было того же раздела повторяется каждый раз?

Теги:
linq

1 ответ

5
Лучший ответ

Вы можете использовать ключевое слово 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
})

Это один из тех случаев, когда я предпочитаю полный синтаксис для свободного синтаксиса, потому что он дает гораздо лучший читаемый код. Под капотом он преобразуется в свободный синтаксис с помощью двух Select s:

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
    })

Выбирайте!

  • 0
    Я действительно надеялся использовать синтаксис метода, но, похоже, мне нужно использовать синтаксис запроса, чтобы использовать Let.
  • 1
    Я всегда использую синтаксис, который дает лучший читаемый код. Но вы можете сделать это с помощью свободного синтаксиса, если будете настаивать. Смотрите мое редактирование.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню