LinqToSql: Как я могу создать проекцию, чтобы придерживаться DRY? - PullRequest
1 голос
/ 09 апреля 2010

Просто интересно, есть ли способ вывести часть повторения из проецируемого типа LINQ to SQL.

Пример:

Таблица: Адрес

Поля: AddressID, HouseNumber, Street, City, State, Zip, +20 больше

Класс MyAddress: AddressID, HouseNumber, Street (только 3 поля)

LINQ:

from a in db.Addresses
select new MyAddress
{
  AddressID = a.AddressID,
  HouseNumber = a.HouseNumber,
  Street = a.Street
}

Приведенный выше запрос работает отлично, и я понимаю, почему что-то подобное возвращает все 20+ полей в каждой строке:

from a in db.Addresses
select new MyAddress(a);

class MyAddress
{
  public MyAddress(Address a)
  {
    this.AddressID = a.AddressID,
    this.HouseNumber = a.HouseNumber,
    this.Street = a.Street
  }
}

Что приводит меня к моему вопросу:

Можно ли реализовать какую-то вспомогательную функцию или метод расширения для "сопоставления" из модели LINQ с MyAddress, но при этом возвращать только необходимые поля в результате запроса, а не все поля?

1 Ответ

2 голосов
/ 12 апреля 2010
from a in db.Addresses
select new MyAddress
{
  AddressID = a.AddressID,
  HouseNumber = a.HouseNumber,
  Street = a.Street
}

Этот запрос выберет только запрашиваемые поля в результирующем SQL.

Функция для повторного использования типа будет выглядеть так:

public IQueryable<MyAddress> ProjectAddress(IQueryable<Address> addresses)
{
    return from a in addresses
           select new MyAddress
           {
               AddressID = a.AddressID,
               HouseNumber = a.HouseNumber,
               Street = a.Street
           };
}

Это можно использовать так:

return ProjectAddress(db.Addresses);

Я думаю, что функция будет выглядеть примерно так:

public static Expression<Func<Address, MyAddress>> ToMyAddress()
{
    return a => new MyAddress { AddressID = a.AddressID, 
                                HouseNumber = a.HouseNumber,
                                Street = a.Street
                              };
}
...