过去两天我一直想知道为什么这不起作用,但对于我的其他表来说,它工作得非常好。我甚至测试了包含许多字段的其他模型。特别是这个,即使只有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.
答案 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));
}