如何在LINQ查询中运行此函数

时间:2012-10-03 14:35:50

标签: c# asp.net asp.net-mvc linq entity-framework

我的功能会为我的类别生成面包屑格式,例如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)'方法和此方法   无法翻译成商店表达。

4 个答案:

答案 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