我有一个填充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来优化此代码?
答案 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