检查参数为空值时,非静态方法需要目标

时间:2017-01-08 16:54:18

标签: c# lambda .net-4.5

在下面的代码中,如果我取消注释以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中有多个其他表达式在这里被注释,它们总是需要被检查。

2 个答案:

答案 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;
}