Entity framework “无法创建类型为..的常量值。在EF查询中仅支持基元类型..”“?
我有一个解决这个问题的方法,但是如果有人能解释为什么会发生这种情况,以及我将如何为我的方法不可行的大型数据集设计这种方法,我将不胜感激 完全错误是: 无法创建“THPT_Razor.Models.WinType”类型的常量值。此上下文中仅支持“Int32、String和Guid”等基本类型 我使用的是EFV4.0 注释行是有问题的代码,解决方法是For循环 先谢谢你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
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版本,以及完整的错误消息。对此表示抱歉。我已更新了帖子。效果很好!非常感谢你的解释。这比其他解释更有意义我在网上找到的一本书——非常清晰和简洁。就像他们说的,了解是成功的一半。