2012-04-15 65 views
9

我已經花了近2天想知道爲什麼這不起作用,但對於我的其他表,它工作得很好。我甚至測試了我的其他模型,其中包含很多領域。 BUt這個特殊的,即使只有2個字段不起作用。我知道我可能會錯過一個明顯的部分,請幫助。LINQ to Entities不支持指定的類型成員。只支持初始值設定項,實體成員和實體導航屬性

這裏是我的模型

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

視圖模型

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

控制器

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

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

查看

@(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() 

)我使用Firebug得到

錯誤:

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

它將有助於瞭解發生異常的位置。這個異常通常表明你使用了一個需要原始值的實體,比如'Where(a => a.Parent == parentObject)'。 (應該是'Where(a => a.ParentId == parentId)')。 – 2012-04-17 21:00:52

回答

11

據我所知,你不能在LINQ到SQL查詢初始化非實體對象。嘗試枚舉結果,然後使用Linq創建視圖模型。

你有什麼(我猜這就是異常被拋出):

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

枚舉,然後使用LINQ創建您的視圖模型:

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

第一的Linq語句被翻譯成SQL語句,結果返回並枚舉爲數組,然後在第二個語句中,該數組用於創建視圖模型的集合。用你最初的語句,Linq語句的SQL翻譯將不得不考慮視圖模型(它無法做到這一點)。

我希望這會有所幫助。 (並且合理):)

2

我相信這裏的問題實際上是源於Telerik,因爲我剛剛使用Telerik Kendo網格來解決這個問題。投影到視圖模型(在選擇內)並不是異常的真正原因。

注意,被引用的列「ReceivedItemID」沒有被映射到投影中。我通過簡單地分配缺失的屬性來解決我的問題。

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

在我的情況下,有一個附加步驟,該模型通過運行:

return Json(model.ToDataSourceResult(request)); 

的Telerik的ToDataSourceRequest擴展方法修改SQL查詢,並且它感到困惑。

0

在控制器代碼,你可以嘗試做以下修改,使之互動

[GridAction] 
public ActionResult GetReceivedItems([DataSourceRequest] DataSourceRequest request) 
    { 
     return Json(db.ReceivedItems.AsEnumerable().Select(x => x).ToDataSourceResult(request)); 
    } 
相關問題