通过避免if else条件来优化linq

时间:2014-03-25 07:19:18

标签: c# linq entity-framework

我有一个填充Gender的DropDownList。

男性的选定值为1,femail为2

根据所选值,我需要从数据库中检索数据。

if (ddlGender==1)
{
    var data= (from item in dbContext.Sample where item.locId > 100 select item);
}
else
{
    var data= (from item in dbContext.Sample where item.locId <100 select item);
}

如何通过避免条件和仅使用单个LINQ来优化此代码?

2 个答案:

答案 0 :(得分:3)

另一个选择是使用过滤器和三元运算符的使用来组合查询:

var data = dbContext.Sample;
data = (ddlGender == 1) ? data.Where(i => i.locId > 100) 
                        : data.Where(i => i.locId < 100);

此选项消除了重复,在生成的查询中没有任何额外条件的开销(请参阅更新),我发现它非常易读。我还建议给常数100提供一些合理的名称。

UPDATE:上面的查询将生成简单明了的SQL

SELECT [Extent1].[locId] AS [locId],
       [Extent1].[Foo] AS [Foo],
       [Extent1].[Bar] AS [Bar]
FROM [dbo].[Sample] AS [Extent1]
WHERE [Extent1].[locId] > 100

如果要添加复杂条件,它将被转换为SQL。例如。

(item.locId > 100 && ddlGender == 1) || (item.locId < 100 && ddlGender != 1)

将使用两个参数转换为以下查询(假设您在数据库中具有不可为空的字段locId)

SELECT [Extent1].[locId] AS [locId],
       [Extent1].[Foo] AS [Foo],
       [Extent1].[Bar] AS [Bar]
FROM [dbo].[Sample] AS [Extent1]
WHERE (([Extent1].[locId] > 100) AND (1 = @p_linq_0) AND (@p_linq_0 IS NOT NULL))
   OR (([Extent1].[locId] < 100) AND 
       (NOT ((1 = @p_linq_1) AND (@p_linq_1 IS NOT NULL))))

答案 1 :(得分:2)

试试这个

var data = from item in dbContect.Sample 
where (item.locId > 100 && ddlGender == 1) || 
(item.locId < 100 && ddlGender != 1)
select item