Bạn có thể chiếu thành kiểu ẩn danh, rồi từ kiểu này sang kiểu mô hình
public IEnumerable<Product> GetProducts(int categoryID)
{
return (from p in Context.Set<Product>()
where p.CategoryID == categoryID
select new { Name = p.Name }).ToList()
.Select(x => new Product { Name = x.Name });
}
Chỉnh sửa : Tôi sẽ cụ thể hơn một chút vì câu hỏi này đã được chú ý rất nhiều.
Bạn không thể chiếu trực tiếp vào loại mô hình (hạn chế EF), vì vậy không có cách nào khác. Cách duy nhất là chiếu vào loại ẩn danh (lần lặp thứ 1), và sau đó đến kiểu mô hình (lần lặp thứ 2).
Cũng xin lưu ý rằng khi bạn tải một phần các thực thể theo cách này, chúng không thể được cập nhật, vì vậy chúng vẫn được tách ra, như chúng vẫn vậy.
Tôi chưa bao giờ hoàn toàn hiểu lý do tại sao điều này là không thể, và câu trả lời trên chủ đề này không đưa ra lý do mạnh mẽ chống lại nó (chủ yếu nói về dữ liệu được tải một phần). Đúng là trong thực thể trạng thái được tải một phần không thể được cập nhật, nhưng sau đó, thực thể này sẽ bị tách ra, do đó, những nỗ lực vô tình để cứu chúng sẽ không thể thực hiện được.
Hãy xem xét phương pháp tôi đã sử dụng ở trên: kết quả là chúng ta vẫn có một thực thể mô hình được tải một phần. Thực thể này được tách ra.
Xem xét mã này có thể (muốn tồn tại):
return (from p in Context.Set<Product>()
where p.CategoryID == categoryID
select new Product { Name = p.Name }).AsNoTracking().ToList();
Điều này cũng có thể dẫn đến một danh sách các thực thể tách rời, vì vậy chúng ta không cần phải thực hiện hai lần lặp. Một trình biên dịch sẽ là thông minh khi thấy rằng AsNoTracking () đã được sử dụng, điều này sẽ dẫn đến các thực thể tách rời, vì vậy nó có thể cho phép chúng ta làm điều này. Tuy nhiên, nếu AsNoTracking () bị bỏ qua, nó có thể ném ngoại lệ giống như hiện tại, để cảnh báo chúng ta rằng chúng ta cần phải đủ cụ thể về kết quả mà chúng ta muốn.