我有一个解决这个问题的方法,但是如果有人能够解释为什么会发生这种情况以及我如何为我的解决方法不可行的大型数据集设计它,我将不胜感激。
完整的错误是:
无法创建“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();
}
_atype
and _wtype
是列表WinType
在记忆中因为你正在申请ToList()
到查询。对于数据库查询,它们是以下集合constant值,因为要在数据库中执行查询,必须将它们作为内存中的值传输到数据库服务器。 EF 不支持将此类常量值或值集合从内存传输到数据库unless它们是原始类型的值(int
例如)。这就是你得到例外的原因。
你尝试过使用吗_atype
and _wtype
as 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
and Single
by FirstOrDefault
因为投影中不支持两者(并且First
都没有),只有FirstOrDefault
是支持的。
我不确定这是否有效。但它应该消除你的例外(但也许你会得到另一个......)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)