如何创建动态查询

本文关键字:动态 查询 创建 何创建 | 更新日期: 2023-09-27 18:18:25

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

然而,SQL查询不允许动态加载,所以我想知道如何用LinQ创建动态查询,以便能够使用动态加载。

我读过这篇文章

使用参数类,但只使用一个参数来执行查询,但如果类中有许多参数,并且有许多组合,如何执行查询?如果考虑到所有可能的组合,我需要做很多其他的?当我使用原始sql时,我只需要检查参数是否为空,如果不为空,只检查是否是添加"where"的第一个参数,或者如果其他我添加"and"。所以代码很短,因为我不需要考虑所有可能的参数组合。

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

谢谢。

如何创建动态查询

var query = ctx.Books;
if ( param1 != null )
   query = query.Where( b => b.Param1 == param1 );
if ( another2 > 0 )
   query = query.Where( b => b.Amount > another );

等。

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

你可以这样做:

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查询添加"过滤器"。

同样地,你可以稍微改变一下,让它变成"And"过滤器而不是"Or"过滤器