带有空对象的 Linq-to-Sql 表达式抛出 NPE

Linq-to-Sql expression with null object throws NPE

以下 linq-to-sql 表达式抛出空指针异常。

List<string> nameList = GetNames();
db.Users.FindSync(u => nameList.Contains(u.Name))

我发现问题是 nameList 为空。但以下更新没有帮助。

u => nameList == null || nameList.Contains(u.Name)

我从 google 搜索中发现 NPE 发生在转换为 SQL 期间(而不是在评估期间)。有办法解决这个问题吗?

想一想 .FindSync(u => ......) 在另一个 context/realm/dimension 中发生的事情 和 Only entity types, enumeration types or primitive types are supported in this context.

您可能认为 "but why nameList.Contains is working" 是因为库支持将其转换为 SQL。遗憾的是不支持 nameList 本身,也不支持 nameList == null。

你的解决方案应该是空检查 outside/before linq 也许像

var uResult = nameList == null ? db.Users.GetAll() : db.Users.FindSync(u => nameList.Contains(u.Name))

看来你在这里没有什么选择。这是我通常用来解决此类问题的方法。

var list = new string[] { "One", "Two", "Three" };
var list2 = new string[] { "One", "Five" };
var db = new string[] { "One", "Two", "Four" };

var conditions = new List<Func<String, bool>>();
if (list != null)
{
    conditions.Add(s => list.Contains(s));
}

if (list2 != null)
{
    conditions.Add(s => list2.Contains(s));
}

var query = db.AsEnumerable(); // AsQuerable on your side.
foreach (var condition in conditions)
{
    query = query.Where(condition);
}

var result = query.ToList(); // Outputs "One".