今天我遇到了同样的问题,我的解决方案与Yoda列出的解决方案相似,但是它仅适用于流利的语法。
使我的解决方案适应您的代码:我向对象类添加了以下静态方法
/// <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());
从逻辑上讲,这等效于James Manning的解决方案,其优点是将成员初始化的膨胀推到类/数据传输对象上
注意:最初,我使用的是比“ Initializer”更具有描述性的名称,但是在回顾我的用法之后,我发现“ Initilizer”就足够了(至少出于我的目的)。
最后说明:
提出此解决方案后,我本来以为共享相同的代码并使之适用于查询语法也很简单。我不再相信情况会如此。我认为,如果您希望能够使用这种速记类型,则需要为上述每个(查询,流利)流利语言提供一个方法,该方法可以存在于对象类本身中。
对于查询语法,将需要扩展方法(或所使用的基类之外的某些方法)。(因为查询语法要操作IQueryable而不是T)
这是我最终使它适用于查询语法的示例。(Yoda已对此进行了详细说明,但我认为用法可能会更清楚,因为一开始我没有得到它)
/// <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();