0

我正在使用实体框架,并且正在制作一种最多可以接收三个变量的方法

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

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

因此,如果所有三个都传入,它将是这样的:

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

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

我开始写这篇文章,为每种可能性制作一个不同的 where 语句,并打算做一堆 if 语句来检查使用哪个,但似乎有更好的方法来做到这一点,我没有想到。

有什么想法吗?

4

3 回答 3

1

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

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

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

于 2012-09-24T20:05:29.757 回答
0

一种选择可能是使用动态 LINQ

于 2012-09-24T19:24:03.607 回答
0
Where( x => x.var1==var1 &&
    (var2 == null || x.var2 == var2))

添加“随意”超过 2...

于 2012-09-24T19:56:24.067 回答