【问题标题】:Another :Unable to create a constant value of type另:无法创建类型的常量值
【发布时间】:2012-07-27 14:42:23
【问题描述】:

每次我想我都掌握了这些东西。

完全错误:

无法创建“Models.staffnames”类型的常量值。此上下文仅支持原始类型(“例如 Int32、String 和 Guid”)。

版本:.Net 4 EF 4

我认为这与 DU 和 db.UserProfiles 可枚举有关,但是当我尝试将其推回以使所有内容都可查询时,整个事情都爆炸了。就目前而言,在构建支持列表时会发生错误。

有趣的是,这个问题似乎只有在我与角色提供者合作时才会出现。在过去,我只是将其转储到 for 循环中。

任何帮助将不胜感激。

代码:

IEnumerable<MembershipUser> du = Roles.GetUsersInRole("Dealer").Select(u => Membership.GetUser(u)).AsEnumerable();
        IQueryable<staffnames> du_up = du.Join(db.UserProfiles.AsEnumerable(), mu => (Guid)mu.ProviderUserKey, up => up.UserID, (mu, up) => new staffnames
        {
            UserId = (Guid)mu.ProviderUserKey,
            FirstName = up.FirstName,
            LastName = up.LastName
        }).AsQueryable();
        List<MemberSupportModel> support = db.Wins_support.Where(s=>s.dealerid == uid && !s.closed).Select(s=> new MemberSupportModel{
             aeramanagerack = s.aeramanagerack,
             amgrname = du_up.Where(a => a.UserId == s.aeramanger).Select(a=>a.FirstName+" "+a.LastName).FirstOrDefault(),
             aeramangerackdate = s.aeramangerackdate,
             atypedesc = _atype.Where(wt => wt.Value == s.atypeid).Select(wt => wt.Description).FirstOrDefault(),
             wtypedesc = _wtype.Where(wt => wt.Value == s.typeid).Select(wt => wt.Description).FirstOrDefault(),
             comment =s.comment,
             dateSubmitted = s.dateSubmitted,
             vdate =s.vdate,
             venuename = s.Venues_Logs.Venue.venueName           
        }).ToList();

【问题讨论】:

    标签: .net entity-framework entity-framework-4


    【解决方案1】:

    问题在于amgrname = du_up.Where(... 行,因为du_up内存中 的非原始类型的集合,因此出现了异常。 AsQueryable 在这里没有用,内存就是内存,你不能改变它。

    我会尝试分别从数据库加载您需要的数据,然后将您的 du_up 集合与从数据库加载的数据集合合并:

    // LINQ to Objects in memory
    IEnumerable<MembershipUser> du = Roles.GetUsersInRole("Dealer")
        .Select(u => Membership.GetUser(u));
    
    // LINQ to Objects in memory
    // db.UserProfiles.AsEnumerable() loads whole UserProfiles table from DB
    IEnumerable<staffnames> du_up = du.Join(db.UserProfiles.AsEnumerable(),
        mu => (Guid)mu.ProviderUserKey, up => up.UserID, (mu, up) => new staffnames
        {
            UserId = (Guid)mu.ProviderUserKey,
            FirstName = up.FirstName,
            LastName = up.LastName
        });
    
    // LINQ to Entites = database query
    List<MemberSupportModel> support = db.Wins_support
        .Where(s=>s.dealerid == uid && !s.closed)
        .Select(s=> new // anonymous result object
        {
            aeramanagerack = s.aeramanagerack,
            aeramanger = s.aeramanger, // needed later for the du_up Where clause
            aeramangerackdate = s.aeramangerackdate,
            atypedesc = _atype.Where(wt => wt.Value == s.atypeid)
                              .Select(wt => wt.Description)
                              .FirstOrDefault(),
            wtypedesc = _wtype.Where(wt => wt.Value == s.typeid)
                              .Select(wt => wt.Description)
                              .FirstOrDefault(),
            comment = s.comment,
            dateSubmitted = s.dateSubmitted,
            vdate = s.vdate,
            venuename = s.Venues_Logs.Venue.venueName
        })
        .AsEnumerable() // execute database query
        // now LINQ to Objects in memory again
        // Copy values from anonymous result object and select data from du_up
        .Select(s => new MemberSupportModel
        {
            aeramanagerack = s.aeramanagerack,
            amgrname = du_up.Where(a => a.UserId == s.aeramanger)
                            .Select(a => a.FirstName + " " + a.LastName)
                            .FirstOrDefault(),
            aeramangerackdate = s.aeramangerackdate,
            atypedesc = s.atypedesc,
            wtypedesc = s.wtypedesc,
            comment = s.comment,
            dateSubmitted = s.dateSubmitted,
            vdate = s.vdate,
            venuename = s.venuename
        })
        .ToList();
    

    【讨论】:

    • 再次感谢 Slauma。从用户配置文件中获取名称似乎需要做很多工作,也许这可能是存储过程更好的调用的情况?
    • 从数据库中加载整个用户配置文件表也不是坏习惯吗?还是个人喜好问题?
    • @Chris:除非您编写存储过程,否则您实际上没有从数据库加载配置文件表的替代方法,因为 ASP.NET 成员表不是您的 EF 模型的一部分,所以您无法编写将 EF 模型与成员资格表连接的任何 LINQ to Entities 查询。我会说:如果您没有性能问题并且 UserProfiles 表不是很大,并且随着时间的推移不会变得很大,请坚持上述方法,否则:存储过程。
    • @Saluma 在审查设计时,我考虑了目标,实际上没有必要参考会员模型。但是额外的学习是一个奖励,所以一切都解决了。我还向 userprofile 表添加了一个 bool IsStaff 字段,该字段将限制拉取。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    相关资源
    最近更新 更多