2

我的功能可以为我的类别生成面包屑格式,例如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

4 回答 4

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,
    });
于 2012-10-03T14:39:19.843 回答
2

您应该能够使用AsEnumerable()which 使 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
});

请注意,您需要在调用之前执行您希望由数据库完成的所有过滤(列/Where 表达式/GroupBy/OrderBy)AsEnumerable(),因为该调用会将在此之前设置的内容获取到本地 IEnumerable,然后执行其余操作使用 Linq to Objects 进行的操作。

于 2012-10-03T14:39:11.607 回答
0

Linq to Entities 查询不能为每个返回的行调用应用程序中的方法(它不能调用 Breadcrumbs)。

我知道的最佳答案是返回 x.ID 并在应用程序层中单独调用 Breadcrumbs(),例如通过使用 .AsEnumerable() 在代码中迭代结果。

于 2012-10-03T14:39:46.770 回答
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 文件而不是代码,您还可以研究模型定义的函数。

于 2012-10-03T14:41:46.860 回答