C# 如何创建动态查询?

C# 如何创建动态查询?,c#,entity-framework-4,C#,Entity Framework 4,我有一个使用EF 4.4的存储库和一个具有参数的类,我可以使用这些参数来过滤我的查询。此外,我还使用SQLQuery创建动态原始sql,以根据参数类的属性(不为null)添加条件 然而,SQL查询不允许即时加载,所以我想知道如何使用LinQ创建动态查询,以便能够使用即时加载 我已经读过了 它使用一个参数类,但只使用一个参数进行查询,但是如果我在类中有许多参数,并且我有许多组合,那么如何进行查询呢?如果要考虑所有可能的组合,我还需要做很多其他的事情?当我使用原始sql时,我只需要检查一个parat

我有一个使用EF 4.4的存储库和一个具有参数的类,我可以使用这些参数来过滤我的查询。此外,我还使用SQLQuery创建动态原始sql,以根据参数类的属性(不为null)添加条件

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

我已经读过了

它使用一个参数类,但只使用一个参数进行查询,但是如果我在类中有许多参数,并且我有许多组合,那么如何进行查询呢?如果要考虑所有可能的组合,我还需要做很多其他的事情?当我使用原始sql时,我只需要检查一个paratemer是否为null,如果不为null,只需要检查是否是第一个添加“where”的paratemer,或者是否其他我添加了“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 );
等等

如您所见,子句是基于任意外部条件动态组合的,最终使您能够完全控制查询结构


请注意,EF仍然将其作为单个db查询执行。

您可以执行以下操作:

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
然后,使用类似以下语法执行查询(假设我们处理用户):

这将根据前面的设置向where查询添加“过滤器”

类似地,您可以将其稍微更改为“和”ing过滤器,而不是“或”ing

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);