2012-04-15 22 views
9

Tôi đã dành 2 ngày qua tự hỏi tại sao điều này không hiệu quả, nhưng đối với các bảng khác, nó hoạt động hoàn toàn tốt. Tôi thậm chí đã thử nghiệm mô hình khác của tôi có chứa nhiều lĩnh vực. BUt này cụ thể, ngay cả với ONLY 2 lĩnh vực không hoạt động. Tôi biết tôi có thể thiếu một phần rõ ràng, xin vui lòng giúp đỡ.Thành viên loại được chỉ định không được hỗ trợ trong LINQ to Entities. Chỉ những người khởi tạo, thành viên thực thể và thuộc tính điều hướng thực thể mới được hỗ trợ

Dưới đây là mẫu của tôi

public class ReceivedItem 
{   
    public int ReceivedItemID { get; set; } 
    public int ItemID { get; set; } 
} 

ViewModel

public class ReceivedItemViewModel 
{ 
    public int ReceivedItemID { get; set; } 
    public int ItemID { get; set; } 
} 

khiển

[GridAction] 
public ActionResult GetReceivedItems() 
    { 
     return View(new GridModel(GetReceivedItemsViewModels())); 
    } 

private IQueryable<ReceivedItemViewModel> GetReceivedItemsViewModels() 
{ 
    return db.ReceivedItems 
     .Select(
      c => new ReceivedItemViewModel 
      { 
       ItemID = c.ItemID 
      }); 
} 

Xem

@(Html.Telerik().Grid<ReceivedItem>() 
.Name("grdItems") 
.DataBinding(binding => binding.Ajax() 
    .Select("GetReceivedItems", "Receiving")) 
.DataKeys(keys => keys.Add(o => o.ItemID)) 
.Columns(cols => 
{ 
    cols.Bound(c => c.ItemID); 
}) 
.Pageable() 
.Sortable() 
.Groupable() 
.Filterable() 

)

Lỗi i đã sử dụng firebug:

The specified type member 'ReceivedItemID' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported. 
+0

Nó sẽ giúp biết nơi ngoại lệ xảy ra. Ngoại lệ này thường chỉ ra rằng bạn sử dụng một thực thể có giá trị nguyên thủy được mong đợi, như 'Where (a => a.Parent == parentObject)'. (Nên là 'Ở đâu (a => a.ParentId == parentId)'). –

Trả lời

11

Từ những gì tôi biết, bạn không thể khởi tạo đối tượng phi thực thể trong một truy vấn LINQ-to-SQL. Hãy thử liệt kê kết quả, sau đó sử dụng LINQ để tạo mô hình xem của bạn.

gì bạn có (Tôi đoán đây là nơi các ngoại lệ đang được ném):

// Original Code 
return db.ReceivedItems 
    .Select(
     c => new ReceivedItemViewModel 
     { 
      ItemID = c.ItemID 
     }); 

liệt kê, sau đó sử dụng LINQ để tạo ra mô hình xem của bạn:

// First statement 
var items = db.ReceivedItems.ToArray(); // Enumerates the collection. 
// Second statement 
return items.Select(
    c => new ReceivedItemViewModel 
    { 
     ItemID = c.ItemID 
    }); 

Các LINQ đầu tiên câu lệnh được dịch thành câu lệnh SQL, các kết quả được trả về và được liệt kê dưới dạng một mảng, sau đó cuối cùng, trong câu lệnh thứ hai, mảng đó được sử dụng để tạo ra tập hợp các mô hình khung nhìn. Với câu lệnh ban đầu của bạn, bản dịch SQL của câu lệnh Linq sẽ phải tính đến mô hình khung nhìn (mà nó không thể làm).

Tôi hy vọng điều này sẽ hữu ích. (và có ý nghĩa) :)

2

Tôi tin rằng vấn đề ở đây thực sự xuất phát từ Telerik, bởi vì tôi vừa gặp phải vấn đề này bằng cách sử dụng Lưới Telerik Kendo. Chiếu đến một mô hình khung nhìn (bên trong lựa chọn) không phải là nguyên nhân thực sự của ngoại lệ.

Lưu ý rằng cột được tham chiếu "ReceivedItemID" không được ánh xạ trong phép chiếu. Tôi đã khắc phục sự cố của mình bằng cách chỉ định thuộc tính bị thiếu.

return db.ReceivedItems 
    .Select(
     c => new ReceivedItemViewModel 
     { 
      ReceivedItemID = c.ReceivedItemID 
      ItemID = c.ItemID 
     }); 

Trong trường hợp của tôi, đã có một bước bổ sung các mô hình được chạy qua:

return Json(model.ToDataSourceResult(request)); 

Các Telerik phương pháp khuyến nông ToDataSourceRequest đổi các truy vấn SQL, và nó đã bị nhầm lẫn.

0

Trong mã điều khiển của bạn, bạn có thể thử thay đổi những điều sau đây để làm cho nó tương tác

[GridAction] 
public ActionResult GetReceivedItems([DataSourceRequest] DataSourceRequest request) 
    { 
     return Json(db.ReceivedItems.AsEnumerable().Select(x => x).ToDataSourceResult(request)); 
    } 
Các vấn đề liên quan