2011-03-30 69 views
4

我想对具有可变搜索条件但使用C#代码的产品执行“动态SQL”搜索的等效操作。例如,产品定义如下:Lambda表达式搜索

class Product 
{ 
    public decimal Price { get; set; } 
    public int Quantity { get; set; } 
} 

我的搜索控件有一个价格文本框和一个数量文本框。如果用户指定了某些内容,它应该包含在搜索中(否则不包含)。实际上,我的产品有两个以上的属性。

如何建立一个基于任何这样的搜索变量标准一般的lambda表达式?

谢谢!

+0

有两种可能的方式来实现这一点:1)构建表达式(http:// msdn.microsoft.com/en-us/library/bb397951.aspx); 2)在EntityFramework中使用以字符串作为参数的重载Where方法(http://msdn.microsoft.com/zh-cn/library/bb338811.aspx)。我不能确切地说哪种方法对你更好,这取决于代码的复杂性。 – vorrtex 2011-03-30 18:24:32

回答

8

而不是建立一个lambda表达式,点点建立查询位:

IQueryable<Product> productQuery = db.Products; 

if (userHasSpecifiedPrice) 
{ 
    productQuery = productQuery.Where(p => p.Price == userSpecifiedPrice) 
} 
// etc 

需要注意的是,直到你开始使用结果这不会执行查询。

查询组合是LINQ的主要优势之一。 (表达式树的构成 - 如果你想要一个单一的Where调用,这是你需要做的事情 - 很不幸,相当困难。)

+0

谢谢!快速跟进:如果我需要跨其他数据库对象(即产品所在的仓库)“加入”,这种技术仍然是首选吗? – John 2011-03-30 18:20:09

+0

@John:如果你需要*有条件*加入,它会变得更复杂。如果你的连接是无条件的,那么它应该没问题。 – 2011-03-31 05:51:38