9

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

)

我使用萤火虫时遇到的错误:

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

4 回答 4

11

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

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

于 2012-06-01T17:57:36.337 回答
3

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

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

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

在我的例子中,模型运行了一个额外的步骤:

return Json(model.ToDataSourceResult(request));

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

于 2013-12-20T08:08:39.803 回答
1

检查以确保您没有将IEnumerable其用于您的收藏,请在此处查看更多信息:https ://stackoverflow.com/a/32997694/550975

于 2015-10-07T16:36:38.587 回答
0

在您的控制器代码中,您可以尝试更改以下内容以使其具有交互性

[GridAction]
public ActionResult GetReceivedItems([DataSourceRequest] DataSourceRequest request)
  {
      return Json(db.ReceivedItems.AsEnumerable().Select(x => x).ToDataSourceResult(request));
  }
于 2015-06-02T01:48:16.157 回答