2012-07-02 45 views
3

我想通过使用Contains方法通过动态LINQ运行IN语句。如果使用下面的代码,它运行得很好:如何使用System.Linq.Dynamic运行SQL等效的IN语句?

var statuses = new List<string> { "Active" }; 
result = result.Where("@0.Contains(Status)", statuses.ToArray()); 

但是,当我切换到一个整数数组,我得到一个错误:

var years = new List<int> { 2012 }; 
result = result.Where("@0.Contains(Year)", years.ToArray()); 

这是我收到使用后的错误:

No applicable method 'Contains' exists in type 'Int32'

有没有办法做到这一点,而不必诉诸使用多个OR语句来解决使用IN语句?

这些查找的数据库中的字段是可为空的字段。这是造成这个问题吗?我把它从int切换到int?它仍然显示相同的错误。有什么建议么?

+0

'result'是什么数据类型? –

+0

IQueryable 其中IRecord模仿我的数据库结构。 – snoluet

回答

2

好了,经过一番研究,看起来Contains并不是“开箱即用”的。当你说你的第一个查询有效时,我真的很惊讶。我试过了,并且与“Int32”一样有错误。

您可能会发现这里的解决方法:

http://blog.walteralmeida.com/2010/05/advanced-linq-dynamic-linq-library-add-support-for-contains-extension-.html

您需要通过yourselft修改System.Linq.Dynamic库,或从这里下载示例项目: http://walteralmeida.typepad.com/files/dynamiclinqextension.zip

但文章现在可能已经过时(不知道自2010年以来System.Linq.Dynamic的发展。

+0

检查空值时,我得到与上面相同的错误。 – snoluet

+0

@snoluet对,我测试过并得到了同样的错误。似乎有点复杂,我编辑了我的答案。 –

+0

@snoluet是否为您解决这个问题?我收到了例外情况 –

0

你必须使用如下,

var resultset = from x in years 
       where x == yearTobeSelected 
       select x; 

,或者您可以通过在代码中的列表中使用IEnumerable.Contains()

1

代码失败,因为你如何使用.Contains。试试这个:

var years = new List<int> { 1, 2, 3, 4 }; 
var result = result.Where(element => years.Contains(element)); 

道歉没有意识到你需要在Dynamic Linq中工作。根据我的理解,默认情况下Dynamic Linq不支持Contains,但可以扩展库以支持它。请看看Walter Almedia的这个链接,它解释了如何扩展库:Extending DynamicLINQ to Support Contains

+0

谢谢你的回答。但是,我试图用System.Linq.Dynamic库来实现这一点。这与查询构建系统一起使用,我不知道正在查询的字段或值。我需要一些可以使用字符串(如动态LINQ库允许您执行的操作)构建SQL的地方。 – snoluet

0
var statuses = new string[] { "Active" }; 
result = result.Where(r => statuses.Contains(r.Status)); 
+0

谢谢你的回答。但是,我试图用System.Linq.Dynamic库来实现这一点。这与查询构建系统一起使用,我不知道正在查询的字段或值。我需要一些可以使用字符串(如动态LINQ库允许您执行的操作)构建SQL的地方。 – snoluet