我有一个解决这个问题的方法,不过如果有人可以解释为什么会这样,以及我如何为大型数据集设计这个问题,我会很感激。我的工作不可行。
完整的错误是: 无法创建“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();
}
答案 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
执行投影时,它会被忽略。此外,我已将SingleOrDefault
和Single
替换为FirstOrDefault
,因为投影中不支持这两种情况(并且First
也不支持),仅支持FirstOrDefault
。
我不确定这是否有效。但它应该删除你的异常(但也许你会得到另一个......)。