【问题标题】:.net mvc3 entity deep compare on Where.net mvc3 实体在 Where 上进行深度比较
【发布时间】:2011-11-19 00:15:03
【问题描述】:

我的控制器代码:

public ViewResult Index(int? ProjectID)
    {
        var user = HttpContext.User;
        User profile = db.Users.Where(d => d.Email == user.Identity.Name).Single();
        var contracts = db.Contracts.Include(c => c.Project);
        if (!user.IsInRole("Admin"))
        {
            contracts = contracts.Where(p => p.Project.Client == profile.Client );
        }

        if (ProjectID != null)
        {
            contracts = contracts.Where(u => u.ID == ProjectID);
        }

        return View(contracts.ToList());
    }

这假设会提取其父项目与当前登录的用户具有相同客户端 fk 的所有合同,除非他们是管理员。这是行不通的。

非管理员查看页面时出现以下错误:

无法创建类型的常量值 'MembershipExt.Models.Client'。只有原始类型('例如 Int32, 在此上下文中支持 String 和 Guid')。

我需要使用第二个包含吗?

【问题讨论】:

    标签: asp.net asp.net-mvc-3 entity-framework-4


    【解决方案1】:

    p.Project.Client 的数据类型是什么?我猜它是一个复杂的类型(它有一些属性)。也许你想要的是这样的......

    contracts = contracts.Where(p => p.Project.Client.ClientID == profile.Client.ClientID );
    

    显然我不知道这个对象是什么样子,但也许这会有所帮助。

    【讨论】:

      【解决方案2】:
      contracts = contracts.Where(p => p.Project.Client == profile.Client );
      

      我猜问题出在上面一行中,lambda 的右侧需要是简单类型,即 int32string 等,但您使用的是复杂类型,即 p.Project.Client

      【讨论】:

        【解决方案3】:

        这看起来不对

        db.Users.Where(d => d.Email == user.Identity.Name)
        

        您似乎正在将电子邮件与姓名进行比较

        【讨论】:

        • 其实是对的。我已经设置好了,所以帐户的用户名就是这个人的电子邮件。我正在查看调试,它显示 user.Identity.Name 是一个电子邮件地址。
        • 许多站点使用电子邮件地址作为用户名,而 ASP.NET 的内置成员资格提供程序不区分(或关心)格式。 Identity.Name 可以是任何字符串。
        • 啊……在我的项目中,我刚刚实现了自己的登录/用户机制,因为我不需要所有角色等(以及我的数据库中的大量表)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-18
        • 1970-01-01
        • 2016-09-01
        • 2020-09-06
        • 2012-02-13
        • 1970-01-01
        相关资源
        最近更新 更多