1

这是一个 Asp.net Mvc 4 Web 应用程序。它一直有效,直到我添加|| User.IsInRole("Admin"). 为什么工作User.IsInRole时不能在 lambda 表达式中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% 确定,但 Linq to Entities 也可能反对合并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 回答