使用contains时,对象引用未设置为LINQ中对象的实例

时间:2014-12-29 14:28:58

标签: c# mysql asp.net linq

我使用带有实体框架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调用中定义列表以尝试本地化问题。两者都没有。

为什么会抛出错误?我该怎么做才能解决它?

1 个答案:

答案 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连接器(除非您已经使用了一个)和/或提交错误报告。