我的功能会为我的类别生成面包屑格式,例如Root->Children
。它起作用,因为当我在我的视图中使用它时,它确实有效并且正在完成它的工作。但是我无法将其转换为LINQ查询。
有人可以解释如何在LINQ查询中转换此特定函数?我已尝试获取数据,然后在foreach
循环中设置它,但它说该属性是只读的。
功能为Infrastructure.CategoryHelpers.Breadcrumbs({id})
,它将返回string
。
public dynamic List()
{
var categories = _db.Categories.Select(x => new {
ID = x.ID,
Breadcrumbs = Infrastructure.CategoryHelpers.Breadcrumbs(x.ID, -1, ""), // this method cannot be translated into a store expression
Name = x.Name,
ItemCount = x.Items.Count
});
foreach (var c in categories)
{
// c.Breadcrumbs = Infrastructure.CategoryHelpers.Breadcrumbs(c.ID); // Value is read only
}
return Json(categories, JsonRequestBehavior.AllowGet);
}
LINQ to Entities无法识别方法'System.String Breadcrumbs(Int32,Int32,System.String)'方法和此方法 无法翻译成商店表达。
答案 0 :(得分:7)
您只需要避免在数据库端执行该方法;从数据库中获取所需内容,将查询转换为linq-to-objects查询,然后调用方法。
var categories = _db.Categories.Select(x => new {
ID = x.ID,
Name = x.NameLatvian,
ItemCount = x.Items.Count
})//restrict the columns returned from the db
.AsEnumerable()//Switch to Linq-to-objects
.Select(x => new {
x.ID,
Breadcrumbs = Infrastructure.CategoryHelpers.Breadcrumbs(x.ID, -1, ""),
x.Name,
x.ItemCount,
});
答案 1 :(得分:2)
您应该能够使用AsEnumerable()
使Linq在本地评估表达式的其余部分;
var categories = _db.Categories.Select(x => new {
ID = x.ID, // This select is done in DB
Name = x.Name,
ItemCount = x.Items.Count
})
.AsEnumerable() // Get result to LINQ to Objects
.Select(x => new {
ID = x.ID, // This select is done in memory.
Breadcrumbs = Infrastructure.CategoryHelpers.Breadcrumbs(x.ID, -1, ""),
Name = x.Name,
ItemCount = x.ItemCount
});
请注意,您需要在<{em> AsEnumerable()
调用之前完成所有要由数据库完成的过滤(columns / Where表达式/ GroupBy / OrderBy),因为该调用将获取所需的内容在此之前设置为本地IEnumerable,并使用Linq to Objects执行其余操作。
答案 2 :(得分:0)
Linq to Entities查询无法为每个返回的行调用应用程序中的方法(它不能调用Breadcrumbs)。
我知道的最佳答案是返回x.ID并在应用程序层中单独调用Breadcrumbs(),例如:通过使用.AsEnumerable()来迭代代码中的结果。
答案 3 :(得分:0)
var categories = from i in (from c in _db.Categories
select new
{
ID = c.ID,
Name = c.Name,
ItemCount = c.Items.Count
}).ToList()
select new
{
ID = i.ID,
Name = i.Name,
ItemCount = i.ItemCount,
Breadcrumbs = Infrastructure.CategoryHelpers.Breadcrumbs(c.ID, -1, String.Empty)
};
但请看下面的评论。
模型定义函数
如果您使用的是EDMX文件而不是代码,则可能还会调查model defined functions。