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()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
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 に答える
0

Linq to Entities クエリは、返された行ごとにアプリケーションでメソッドを呼び出すことはできません (Breadcrumbs を呼び出すことはできません)。

私が知っている最良の答えは、 x.ID を返し、アプリケーション層で Breadcrumbs() を個別に呼び出すことです。たとえば、.AsEnumerable() を使用してコードで結果を反復処理します。

于 2012-10-03T14:39:46.770 に答える