1

これは、Asp.net Mvc4Webアプリケーションです。追加するまでは機能しまし|| User.IsInRole("Admin")た。User.IsInRole動作中にラムダ式に含めることができないのはなぜUser.Identity.Nameですか?

    private IQueryable<Item> Items
    {
        get
        {
            return _db.Items.Where(d => (d.CreatedBy == User.Identity.Name || User.IsInRole("Admin")));
        }
    }

    public ActionResult Index()
    {
        var items = Items.Include(d => d.Address);
        return View(items.ToList());
    }

エラーはで発生しましたitems.ToList()

LINQ to Entitiesは、メソッド'Boolean IsInRole(System.String)'メソッドを認識せず、このメソッドをストア式に変換できません。

4

3 に答える 3

5

User.IsInRole()データベースクエリに組み込むことができるものではないため、エラーが発生します。

次のようなものを試してください。

 if(User.IsInRole("admin"))
    return _db.Items;
 else 
 {
    string name = User.Identity.Name;
    return _db.Items.Where(d => d.CreatedBy.Equals(name)));
 }

テストなしでは100%確実ではありませんが、LinqtoEntitiesもUser.Identity.Name式に組み込むことに反対する可能性があります。その値を取得して個別に渡すことにより、定数として扱われます。

User.Identity同じ式で、メモリ内のもの(など)のテストとエンティティフィールド(実際にはデータベース列)のテストを組み合わせることはできません。Linq to Entitiesは、すべての式をデータベースにプッシュしようとし、それができない場合は反対します。

于 2013-03-17T00:23:00.740 に答える
2

これはlinqの有効な方法ではありません。リンクに渡されるすべてのメソッドはSQL式に変換する必要があることを覚えておく必要があります。.netまたはlinq内のアセンブリから関数を呼び出すことはできません

于 2013-03-17T00:18:29.740 に答える
2

管理者用に個別にクエリを実行します。

private IQueryable<Item> Items
    {
        get
        {
            var items = _db.Items;
            if (User.IsInRole("Admin"))
            {
                 return items;
            }
            return items.Where(d => d.CreatedBy == User.Identity.Name);
        }
    }

Entity Frameworkは、それをSQL式に変換しようとしていますが、そのためには変換できません。

于 2013-03-17T00:20:02.377 に答える