带有空对象的 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".
以下 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".