Сегодня у меня была такая же проблема, и мое решение было похоже на то, что указал Йода, однако оно работает только с плавным синтаксисом.
Адаптируя свое решение к вашему коду: я добавил следующий статический метод в класс объекта
/// <summary>
/// use this instead of a parameritized constructor when you need support
/// for LINQ to entities (fluent syntax only)
/// </summary>
/// <returns></returns>
public static Func<Naleznosci, Payments> Initializer()
{
return n => new Payments
{
Imie = n.Dziecko.Imie,
Nazwisko = n.Dziecko.Nazwisko,
Nazwa = n.Miesiace.Nazwa,
Kwota = n.Kwota,
NazwaRodzajuOplaty = n.RodzajeOplat.NazwaRodzajuOplaty,
NazwaTypuOplaty = n.RodzajeOplat.TypyOplat.NazwaTypuOplaty,
DataRozliczenia = n.DataRozliczenia,
TerminPlatnosc = n.TerminPlatnosci
};
}
а затем обновил базовый запрос до следующего:
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select new Payments.Initializer());
Это логически эквивалентно решению Джеймса Мэннинга с тем преимуществом, что раздувание инициализации членов для класса / объекта передачи данных
Примечание. Первоначально я использовал более описательные имена, чем «Инициализатор», но после рассмотрения того, как я его использовал, я обнаружил, что «Инициализатор» было достаточно (по крайней мере, для моих целей).
Заключительное примечание:
придумав это решение, я изначально думал, что было бы просто поделиться одним и тем же кодом и адаптировать его для работы с синтаксисом запросов. Я больше не верю, что это так. Я думаю, что если вы хотите иметь возможность использовать этот тип сокращенной конструкции, вам понадобится метод для каждого (запрос, беглый), как описано выше, который может существовать в самом классе объекта.
Для синтаксиса запроса потребуется метод расширения (или какой-либо метод за пределами используемого базового класса). (поскольку синтаксис запроса хочет работать с IQueryable, а не с T)
Вот пример того, что я использовал, чтобы наконец заставить это работать для синтаксиса запросов. (Йода уже прибил это, но я думаю, что использование могло бы быть более ясным, потому что сначала я не понял этого)
/// <summary>
/// use this instead of a parameritized constructor when you need support
/// for LINQ to entities (query syntax only)
/// </summary>
/// <returns></returns>
public static IQueryable<Payments> Initializer(this IQueryable<Naleznosci> source)
{
return source.Select(
n => new Payments
{
Imie = n.Dziecko.Imie,
Nazwisko = n.Dziecko.Nazwisko,
Nazwa = n.Miesiace.Nazwa,
Kwota = n.Kwota,
NazwaRodzajuOplaty = n.RodzajeOplat.NazwaRodzajuOplaty,
NazwaTypuOplaty = n.RodzajeOplat.TypyOplat.NazwaTypuOplaty,
DataRozliczenia = n.DataRozliczenia,
TerminPlatnosc = n.TerminPlatnosci
};
}
и использование
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select nalTmp).Initializer().ToList();