Tôi đã có cùng một vấn đề ngày hôm nay và giải pháp của tôi tương tự như những gì Yoda liệt kê, tuy nhiên nó chỉ hoạt động với cú pháp trôi chảy.
Điều chỉnh giải pháp của tôi theo mã của bạn: Tôi đã thêm phương thức tĩnh sau vào lớp đối tượng
/// <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
};
}
và sau đó cập nhật truy vấn cơ bản thành như sau:
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select new Payments.Initializer());
Điều này tương đương về mặt logic với giải pháp của James Manning với lợi thế là đẩy sự khởi đầu của thành viên vào Đối tượng truyền dữ liệu / lớp
Lưu ý: Ban đầu tôi đang sử dụng các tên mô tả nhiều hơn là "Công cụ khởi tạo" nhưng sau khi xem lại cách tôi đang sử dụng, tôi thấy rằng "Công cụ khởi tạo" là đủ (ít nhất là cho mục đích của tôi).
Lưu ý cuối cùng:
Sau khi đưa ra giải pháp này, ban đầu tôi nghĩ sẽ rất đơn giản để chia sẻ cùng một mã và điều chỉnh nó để làm việc với cú pháp Truy vấn. Tôi không còn tin rằng đó là trường hợp. Tôi nghĩ rằng nếu bạn muốn có thể sử dụng kiểu xây dựng tốc ký này, bạn sẽ cần một phương thức cho mỗi (truy vấn, lưu loát) trôi chảy như được mô tả ở trên có thể tồn tại trong chính lớp đối tượng.
Đối với cú pháp truy vấn, một phương thức mở rộng (hoặc một số phương thức bên ngoài lớp cơ sở đang được sử dụng) sẽ được yêu cầu. (vì cú pháp truy vấn muốn vận hành IQueryable chứ không phải T)
Đây là một ví dụ về những gì tôi đã sử dụng để cuối cùng làm việc này cho cú pháp truy vấn. (Yoda đã đóng đinh cái này nhưng tôi nghĩ việc sử dụng có thể rõ ràng hơn vì lúc đầu tôi không hiểu
/// <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
};
}
và cách sử dụng
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select nalTmp).Initializer().ToList();