以下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".