Entity framework “无法创建类型为..的常量值。在EF查询中仅支持基元类型..”“?

Entity framework “无法创建类型为..的常量值。在EF查询中仅支持基元类型..”“?,entity-framework,Entity Framework,我有一个解决这个问题的方法,但是如果有人能解释为什么会发生这种情况,以及我将如何为我的方法不可行的大型数据集设计这种方法,我将不胜感激 完全错误是: 无法创建“THPT_Razor.Models.WinType”类型的常量值。此上下文中仅支持“Int32、String和Guid”等基本类型 我使用的是EFV4.0 注释行是有问题的代码,解决方法是For循环 先谢谢你 List<WinType> _atype = db.WinTypes.Where(wt => wt.IsWin

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

完全错误是: 无法创建“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();
}
_atype和_wtype是内存中WinType的列表,因为您正在对查询应用ToList。对于数据库查询,它们是常量值的集合,因为要在数据库中执行查询,它们必须作为内存中的值传输到数据库服务器。EF不支持传输此类常量v从内存到数据库的值或值集合,除非它们是基本类型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执行投影时,它将被忽略。此外,我还将SingleOrDefault和Single替换为FirstOrDefault,因为投影中不支持这两个选项,而First两者都不支持,只支持FirstOrDefault


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

考虑在帖子中添加所用的EF版本,以及完整的错误消息。对此表示抱歉。我已更新了帖子。效果很好!非常感谢你的解释。这比其他解释更有意义我在网上找到的一本书——非常清晰和简洁。就像他们说的,了解是成功的一半。