У меня была та же проблема сегодня, и мое решение было похоже на то, что перечислил Йода, однако оно работает только с беглым синтаксисом.
Адаптация моего решения к вашему коду: я добавил следующий статический метод в класс объекта
/// <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());
Это логически эквивалентно решению Джеймса Мэннинга с преимуществом передачи раздувания инициализации члена в класс /Объект передачи данных
Примечание. Первоначально я использовал более описательные имена, чем «Initializer», но после проверки того, как я его использовал, я обнаружил, что «Initilizer» было достаточно (по крайней мере, для моих целей).
Заключительное примечание:
После того, как я пришел к этому решению, я изначально думал, что было бы просто разделить один и тот же код и адаптировать его для работы с синтаксисом Query.Я больше не верю, что это так.Я думаю, что если вы хотите иметь возможность использовать этот тип сокращенной конструкции, вам потребуется метод для каждого беглого (запроса, беглого), как описано выше, который может существовать в самом классе объектов.
Для синтаксиса запросапотребуется метод расширения (или какой-либо метод вне используемого базового класса).(так как синтаксис запроса хочет работать с 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();