“无法创建类型的常量值。在EF查询中只支持原始类型..”

时间:2012-07-25 16:55:28

标签: entity-framework

我有一个解决这个问题的方法,不过如果有人可以解释为什么会这样,以及我如何为大型数据集设计这个问题,我会很感激。我的工作不可行。

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

我正在使用EF v4.0。

注释行是违规代码,解决方法是“For loop”

提前谢谢。

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();
}

1 个答案:

答案 0 :(得分:3)

_atype_wtype是内存中WinType 的列表,因为您将ToList()应用于查询。对于数据库查询,它们是常量值的集合,因为要在数据库中执行查询,它们必须作为它们在内存中的值传输到数据库服务器。 EF不支持将这些常量值或值集合从内存传输到数据库,除非它们是基本类型的值(例如int)。这就是你得到例外的原因。

您是否尝试将_atype_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执行投影时,它会被忽略。此外,我已将SingleOrDefaultSingle替换为FirstOrDefault,因为投影中不支持这两种情况(并且First也不支持),仅支持FirstOrDefault

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