最有效的方法是使用未知数量的变量进行搜索以匹配EF linq?

时间:2012-09-24 19:19:37

标签: c# linq entity-framework lambda

我正在使用实体框架并且正在创建一个最多可以包含三个变量的方法

public SearchTable(int var1, int var2, int var3)

我希望能够在实体框架中使用,但仅限于传入的变量。

所以,如果所有三个都被传入,那将是这样的:

var results = entities.vw_ToSearch.Where(x => x.var1 == var1 && x.var2 == var2 && x.var3 == var3);

但是如果例如var2作为null传递而没有值,我希望它只在var1和var2上执行where。

我开始编写这个,为每种可能性制作一个不同的where语句,并且要做一堆if语句来检查哪一个使用,但似乎有更好的方法来做到这一点,我不是思考。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

由于您正在对谓词进行AND运算,因此可以应用以下逻辑:

IQueryable<vw_ToSearchItem> results = entities.vw_ToSearch;
if (x.var1.HasValue)
   results = results.Where(x => x.var1 == var1);
if (x.var2.HasValue)
   results = results.Where(x => x.var2 == var2);
if (x.var3.HasValue)
   results = results.Where(x => x.var3 == var3);

这种方法的优点是您只需将所需的过滤器传递给数据库,并且不要求它对每一行进行可空性检查(可能导致表扫描而不是利用已建立的索引)。与大多数性能问题一样,您需要评估每种方法生成的执行计划,以确定哪种方法最适合您的需求。

答案 1 :(得分:0)

一种选择可能是使用Dynamic LINQ

答案 2 :(得分:0)

Where( x => x.var1==var1 &&
    (var2 == null || x.var2 == var2))

添加“ad libitum”超过2 ...