非静态方法在检查空值参数时需要一个目标

Non-static method requires a target when checking paramater for null values

在下面的代码中,如果我取消注释以 queItem.RequestedMap == null 开头的行,我会得到

Non-static method requires a target.

如果我然后改为使用 .ToList() 重写它,然后在它工作之后执行相同的 where 查询。这告诉我 .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中还有多个其他表达式,它们总是需要检查。

这不是你想要的吗?我看不出 queItem.RequestedMap 检查应该是 LINQ 的一部分的原因,因为它不是数据库的一部分。

Game gameToJoin = null;
if(queItem.RequestedMap == null)
{
     gameToJoin = db.Games
                    .Where(x => x.Map.Id == queItem.RequestedMap.Id)
                    .FirstOrDefault;
}
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();