2012-01-03 91 views
33

我想做一个LINQ语句,where子句来自一个变量。例如:C#Linq where子句作为变量

string whereClause = address.zip == 23456; 
var x = from something in someList where whereClause; 

这可能吗?我似乎无法得到它的工作。

感谢,

更新 - 我的where子句是预定义的,将根据用户输入的,所以我不认为这会为我工作。基本上,在方法中没有构造Clause的地方,它是LINQ的方法的一个参数。我没有解释,以及这是一个更好的例子:

public void doLnq(string whereClause) 
{ 
    var x = from something in someList where whereClause; 
    dowork(x); 
} 

更新 - 只是总结一些建议,集中一切。

我不能使用开关来生成where子句,因为有很多可能性。

您已经发布了一些动态linq帖子看起来很有前途,但是我有麻烦将linq转换为sql示例到我的linq到对象问题。翻翻MSDN http://msdn.microsoft.com/en-us/library/bb353734.aspx我有麻烦搞清楚你的​​意思是使用AsQueryable已

感谢,

+0

呃,没有。 where子句只是* not *一个字符串,它是一个返回布尔值的表达式。除......看到SLaks的链接! – sq33G 2012-01-03 21:22:54

+0

@ sq33G在这种情况下的字符串将是“address.zip == 23456”我想用作表达式。该字符串来自用户输入,因此他们可以进行自定义搜索。那有意义吗? – kds6253 2012-01-03 21:25:32

+0

我猜测用户正在从下拉菜单中选择字段(字段==值)。所以你可以使用switch语句来构建一个Func 作为Where委托来发送。 – sq33G 2012-01-03 21:29:08

回答

49

和@sLaks你需要组装的Expression<Func<T, bool>>并把它传递给Where()扩展方法:

Expression<Func<T, bool>> whereClause = a => a.zip == 23456; 
var x = frSomeList.Where(whereClause); 

编辑:如果您使用LINQ到对象,删除该单词Expression创建n普通代表。

+1

使用'linq-to-objects'标签,表达式*是否合适? – 2012-01-03 21:01:45

+0

请参阅更新 – kds6253 2012-01-03 21:06:21

+0

@ kds6253:然后您可以将委托作为参数。如果你需要使用一个字符串,你可以使用动态LINQ(但速度会更慢) – SLaks 2012-01-03 21:08:50

9

此:

var query = from something in someList where whereClause; 

是简写:

var query = someList.Where(something => whereClause); 

假设someListIEnumerable<Address>WhereEnumerable.Where Extension Method。此方法预计您可以定义如下的Func<Address, bool>

Func<Address, bool> whereClause = address => address.Zip == 23456; 
var query = someList.Where(whereClause); 
+0

请参阅更新 – kds6253 2012-01-03 21:05:45

0

如果要在运行时定义Where子句,则需要使用动态查询。

斯科特谷写了一个伟大的职位约在这里:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

希望有所帮助。

+0

我以前看过这篇文章,我不太明白如何将它应用于我的情况。我对此比较陌生,所以请耐心等待。他使用的例子是LINQ to Sql我相信和数据源是Northwind数据库。我怎样才能改变这与我的Linq to Object问题一起工作?一旦我再次感谢帮助。 – kds6253 2012-01-03 21:22:12

3

正如理查德指出的,动态查询库可用于构建动态过滤器表达式。当使用Linq-To-Objects时,请务必先将IEnumerable<T>转换为IQueryable<T>。这里是一个(不完整的)例子:

using System.Linq.Dynamic; 

namespace System.Linq.Dynamic 
{ 
    public class Example 
    { 
    // Assuming some value is assigned to below field somewhere... 
    private IEnumerable<Address> m_Addresses; 

    public void FilterByZipCode(string zipCode) 
    { 
     var x = m_Addresses.AsQueryable().Where("Zip == @0", zipCode); 
     dowork(x); 
    } 
    } 

    public class Address 
    { 
    public String Zip { get; set; } 

    // More Properties... 
    } 
}