我使用带有实体框架6的C#的ASP.NET MVC。我有以下3行代码。 x
是真的。
var x = new List<string>(){"FOO", "BAR"}.Contains("FOO");
var foo = db.TableName.Where(n => new List<string>() { "FOO", "BAR" }.Contains("FOO"));
var bar = foo.ToList();
在第三行引发错误:对象引用未设置为对象的实例。
为了完全清楚,以下几行不会引发任何错误:
var x = false;
var foo = db.TableName.Where(n => false);
var bar = foo.ToList();
我所看到的所有答案都说我应该检查以确保列表不为空。我尝试了无济于事,然后尝试在LINQ Where调用中定义列表以尝试本地化问题。两者都没有。
为什么会抛出错误?我该怎么做才能解决它?
答案 0 :(得分:2)
由于db.TableName.Where(n => false).ToList()
和db.TableName.Where(n => true).ToList()
都不会产生异常,因此问题必须出在MySql的EF数据提供程序中。
Stack trace that you have posted确认了这一假设:异常发生在SQL生成阶段,在EF甚至到达您的数据之前。
[NullReferenceException: Object reference not set to an instance of an object.]
MySql.Data.Entity.SqlGenerator.Visit(DbPropertyExpression expression) +18
MySql.Data.Entity.SqlGenerator.Visit(DbInExpression expression) +39
System.Data.Entity.Core.Common.CommandTrees.DbInExpression.Accept(DbExpressionVisitor`1 visitor) +64
MySql.Data.Entity.SqlGenerator.VisitBinaryExpression(DbExpression left, DbExpression right, String op) +82
MySql.Data.Entity.SqlGenerator.Visit(DbAndExpression expression) +49
...
换句话说,错误与您的数据无关。它是由数据提供程序无法将有效的条件表达式转换为SQL引起的。考虑升级到最新的.NET连接器(除非您已经使用了一个)和/或提交错误报告。