linq-to-sql表达式用空对象抛出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 => ......)内部在另一个上下文/领域/维度中发生的情况和Only entity types, enumeration types or primitive types are supported in this context.

您可能会认为"但是为什么namelist.contains正在工作",这是因为图书馆确实支持将其转换为SQL。可悲的是,Namelist本身不受支持,也不支持Namelist == null。

您的解决方案应在LINQ之前/在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".

最新更新