วันนี้ฉันมีปัญหาเดียวกันและวิธีแก้ปัญหาของฉันก็คล้ายกับที่ 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 โดยมีข้อได้เปรียบในการผลักดันการขยายตัวของการเริ่มต้นสมาชิกไปยัง Class / Data Transfer Object
หมายเหตุ: เดิมทีฉันใช้ชื่อที่สื่อความหมายมากกว่านี้ว่า "Initializer" แต่หลังจากตรวจสอบวิธีการใช้แล้วฉันพบว่า "ตัวเริ่มต้น" นั้นเพียงพอแล้ว (อย่างน้อยก็สำหรับวัตถุประสงค์ของฉัน)
หมายเหตุสุดท้าย:
หลังจากหาวิธีแก้ปัญหานี้แล้วตอนแรกฉันคิดว่ามันจะง่ายมากที่จะแบ่งปันรหัสเดียวกันและปรับให้เข้ากับไวยากรณ์ของ Query ด้วย ฉันไม่เชื่อว่าจะเป็นเช่นนั้นอีกต่อไป ฉันคิดว่าถ้าคุณต้องการใช้การสร้างชวเลขประเภทนี้คุณจะต้องมีวิธีการสำหรับแต่ละ (แบบสอบถามคล่องแคล่ว) อย่างคล่องแคล่วตามที่อธิบายไว้ข้างต้นซึ่งสามารถมีอยู่ในคลาสอ็อบเจ็กต์เอง
สำหรับไวยากรณ์การสืบค้นจำเป็นต้องใช้วิธีการขยาย (หรือวิธีการบางอย่างที่อยู่นอกคลาสพื้นฐานที่ใช้) (เนื่องจากไวยากรณ์การสืบค้นต้องการใช้งาน 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();