如何创建动态查询?

时间:2013-06-15 08:27:12

标签: c# entity-framework-4

我有一个使用EF 4.4的存储库和一个具有可用于过滤查询的参数的类。另外,我使用SQLQuery创建动态原始sql,根据我的参数类的非空属性添加条件。

但是,SQL Query不允许急切加载,因此我想知道如何使用LinQ创建动态查询以便能够使用预先加载。

我引用了这个post

使用参数类,但只使用一个参数来进行查询,但如果我在类中有很多参数并且我有很多组合,那怎么办呢?如果要考虑所有可能的组合,我还需要做很多其他事情吗?当我使用原始sql时,我只需要检查paratemer是否为null,如果不为null,则只检查是否是第一个添加“where”的paratemer或者如果是其他我添加“and”。所以代码很短,因为我不需要考虑所有可能的参数组合。

如何使用LinQ进行动态查询?

感谢。

2 个答案:

答案 0 :(得分:3)

var query = ctx.Books;

if ( param1 != null )
   query = query.Where( b => b.Param1 == param1 );

if ( another2 > 0 )
   query = query.Where( b => b.Amount > another );

正如您所看到的,子句是根据任意外部条件动态组合的,最终可以让您完全控制查询结构。

请注意,EF仍将其作为单个数据库查询执行。

答案 1 :(得分:1)

您可以这样做:

bool consider1stParam = is it not null?
bool consider2ndParam = is it not null?
bool consider3rdParam = is it not null?
... //And so on for each parameter you wish to include in the query

然后,使用与此类似的语法进行查询(假设我们处理用户):

users = users
        .Where(u => (consider1stParam && (Your 1st param examination here)) ||
                        (consider2ndParam && (Your 2nd param examination here)) ||
                        (consider3rdParam && (Your 3rd param examination here)) 
                     ... and so on);

这会根据之前的设置为where查询添加“过滤器”。

同样,您可以稍微改变它以“过滤”而不是“或”。