在下面的代码中,如果我取消注释以queItem.RequestedMap == null
开头的行,我会
非静态方法需要目标。
如果我然后改为现在改写它,使用.ToList()
然后在查询之后执行相同的操作。这告诉我.net无法将queItem.RequestedMap == null
的空检查转换为特定于sql的内容。
queItem
是传递给包含此代码的方法的对象参数。
有没有办法我可以写这个而不将数据检索回.net然后再做另一个?我发现现有的答案只是从lambda查询中删除了这些表达式,我不想这样做。
var gameToJoin = db.Games
//.Where(x =>
// (queItem.RequestedMap == null || x.Map.Id == queItem.RequestedMap.Id) // no map preference or same map
//)
.ToList()
.Where(x =>
queItem.RequestedMap == null
|| x.Map.Id == queItem.RequestedMap.Id) // no map preference or same map)
.FirstOrDefault();
编辑:此外,在真正的查询表达式中,第一个.Where
中有多个其他表达式在这里被注释,它们总是需要被检查。
答案 0 :(得分:1)
var gameToJoin = db.Games.AsQueryable();
// add the where's that always need to be checked.
if (queItem.RequestMap != null)
{
gameToJoin = gameToJoin.Where(x => x.Map.Id = queItem.RequestMap.Id);
}
var result = gameToJoin.ToList();
或者你更愿意使用FirstOrDefault()
var gameToJoin = db.Games.AsQueryable();
// add the where's that always need to be checked.
if (queItem.RequestMap != null)
{
var result = new List<Game>();
var game = gameToJoin.FirstOrDefault(x => x.Map.Id = queItem.RequestMap.Id);
if (game != null)
{
result.Add(game);
}
return result;
}
return gameToJoin.ToList();
答案 1 :(得分:0)
这不会产生你想要的东西吗?我没有看到queItem.RequestedMap
检查应该成为LINQ的一部分的原因,因为它不是数据库的一部分。
Game gameToJoin = null;
if(queItem.RequestedMap == null)
{
gameToJoin = db.Games
.Where(x => x.Map.Id == queItem.RequestedMap.Id)
.FirstOrDefault;
}