LINQ to Entities不支持指定的类型成员。仅支持初始值设定项,实体成员和实体导航属性

时间:2012-04-15 04:35:50

标签: asp.net-mvc-3 linq entity-framework grid

过去两天我一直想知道为什么这不起作用,但对于我的其他表来说,它工作得非常好。我甚至测试了包含许多字段的其他模型。特别是这个,即使只有2个字段也不起作用。我知道我可能会错过一个明显的部分,请帮忙。

这是我的模特

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.

4 个答案:

答案 0 :(得分:12)

据我所知,您无法在Linq-to-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转换必须考虑视图模型(它无法做到)。

我希望这会有所帮助。 (并且有道理):))

答案 1 :(得分:2)

我认为这里的问题实际上源于Telerik,因为我刚刚使用Telerik Kendo Grid遇到了这个问题。投影到视图模型(在select中)并不是异常的实际原因。

请注意,引用列“ReceivedItemID”未在投影中映射。我通过简单地分配缺失的属性来解决我的问题。

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

就我而言,模型还有一个额外的步骤:

return Json(model.ToDataSourceResult(request));

Telerik ToDataSourceRequest扩展方法修改了SQL查询,并且它变得混乱。

答案 2 :(得分:1)

检查以确保您没有使用IEnumerable收集,请点击此处了解详情:https://stackoverflow.com/a/32997694/550975

答案 3 :(得分:0)

在您的控制器代码中,您可以尝试更改以下内容以使其成为交互式

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