1

毎回、私はこのようなものを理解していると思います。

完全なエラー:

タイプ'Models.staffnames'の定数値を作成できません。このコンテキストでは、プリミティブ型('Int32、String、Guid'など)のみがサポートされます。

バージョン:.Net 4 EF 4

DUとdb.UserProfilesが列挙可能であることと関係があると思いますが、すべてをIQueryableにするためにプッシュバックしようとすると、すべてが失敗します。現在のところ、サポートリストを作成するときにエラーが発生します。

この問題が発生しているように見えるのは、ロールプロバイダーを使用しているときだけであることに注意してください。これまで、私はそれを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();
4

1 に答える 1

1

問題は行です。amgrname = du_up.Where(...これは、メモリ内du_upの非プリミティブ型のコレクションであるため、例外です。ここでは役に立ちません。メモリ内はメモリ内です。変更することはできません。AsQueryable

DBから必要なデータを個別にdu_upロードしてから、コレクションをDBからロードされたデータのコレクションとマージしようとします。

// 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();
于 2012-07-27T15:39:24.640 に答える