3

我有一个解决这个问题的方法,但是如果有人能解释为什么会发生这种情况以及我将如何为我的解决方法不可行的大型数据集设计它,我将不胜感激。

完整的错误是:无法创建类型为“THPT_Razor.Models.WinType”的常量值。此上下文仅支持原始类型(“例如 Int32、String 和 Guid”)。

我正在使用 EF v4.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。我也替换了SingleOrDefaultand SingleFirstOrDefault因为投影中不支持两者(也不支持First),仅FirstOrDefault支持。

我不确定这是否可行。但它应该删除你的异常(但也许你会得到另一个......)。

于 2012-07-25T17:38:01.177 回答