Я использую 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("Первичный")) **, чтобы у меня не было того же раздела повторяется каждый раз?
Вы можете использовать ключевое слово 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
})
Выбирайте!