3

この問題の回避策はありますが、なぜこれが発生しているのか、回避策が実行できない大規模なデータセット用にこれをどのように設計するのかを誰かが説明していただければ幸いです。

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

EFv4.0を使用しています。

コメントされた行は問題のあるコードであり、回避策は「Forループ」です。

前もって感謝します。

List<WinType> _atype = db.WinTypes.Where(wt => wt.IsWin == false).ToList();
List<WinType> _wtype = db.WinTypes.Where(wt => wt.IsWin == true).ToList();
string test = _wtype.Where(wt => wt.Value ==0).Select(wt => wt.Description).SingleOrDefault();
List<WinCheckDetails> wcd = db.Wins.Include("UserProfiles").Where(w => w.venueLogId == logid).Select(w => new WinCheckDetails
{
    //awarddesc = w.atypeid.HasValue ? _atype.Where( wt=> wt.Value == w.atypeid).Select(wt => wt.Description).SingleOrDefault():string.Empty,
    //windesc = _wtype.Where(wt => wt.Value == w.typeid).Select(wt => wt.Description).Single(),
    atypeid = w.atypeid,
    typeid = w.typeid,
    WinId = w.WinId,
    other = w.other,
    posterid = w.posterid,
    confirmed = w.confirmed,
    posttime = w.posttime,
    game = w.game,
    playerid = w.UserProfile.PlayerID,
    firstname = w.UserProfile.FirstName,
    lastname = w.UserProfile.LastName,
    fullname = w.UserProfile.FirstName + " " + w.UserProfile.LastName
}).OrderBy(o => o.game).ToList();
foreach (WinCheckDetails wc in wcd)
{
    wc.awarddesc = _atype.Where(wt => wt.Value == wc.atypeid).Select(wt => wt.Description).SingleOrDefault();
    wc.windesc = _wtype.Where(wt => wt.Value == wc.typeid).Select(wt => wt.Description).SingleOrDefault();
}
4

1 に答える 1

3

_atypeクエリに適用しているため、メモリ内_wtypeのリストです。データベースクエリに関しては、データベースでクエリを実行するには、メモリ内の値としてデータベースサーバーに送信する必要があるため、これらは定数値のコレクションです。EFは、そのような定数値または値のコレクションを、プリミティブ型の値でない限り、メモリからデータベースに転送することをサポートしていません(たとえば)。これが、例外が発生する理由です。WinType ToList()int

リストの代わりに_atypeand_wtypeを使用しようとしましたか?IQueryable

IQueryable<WinType> _atype = db.WinTypes.Where(wt => !wt.IsWin);
IQueryable<WinType> _wtype = db.WinTypes.Where(wt => wt.IsWin);

List<WinCheckDetails> wcd = db.Wins
    .Where(w => w.venueLogId == logid)
    .Select(w => new WinCheckDetails
    {
        awarddesc = w.atypeid.HasValue
            ? _atype.Where(wt=> wt.Value == w.atypeid)
                    .Select(wt => wt.Description).FirstOrDefault()
            : string.Empty,
        windesc = _wtype.Where(wt => wt.Value == w.typeid)
                        .Select(wt => wt.Description).FirstOrDefault(),

        // ... (unchanged)
    }).OrderBy(o => o.game).ToList();

Includeを使用して投影を実行すると、とにかく無視されるため、を削除しましたSelect。また、私は置き換えました。両方がプロジェクションでサポートされていないため(どちらもサポートされていないためSingleOrDefault)、のみサポートされています。SingleFirstOrDefaultFirstFirstOrDefault

それがうまくいくかどうかはわかりません。しかし、それはあなたの例外を取り除くはずです(しかし多分あなたは別の例外を得るでしょう...)。

于 2012-07-25T17:38:01.177 に答える