C# 通过避免if-else条件优化linq
我有一个关于性别的下拉列表 男性的选择值为C# 通过避免if-else条件优化linq,c#,linq,entity-framework,C#,Linq,Entity Framework,我有一个关于性别的下拉列表 男性的选择值为1,女性的选择值为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);
1
,女性的选择值为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);
}
if(ddlegender==1)
{
var data=(来自dbContext.Sample中的项,其中item.locId>100选择项);
}
其他的
{
var data=(来自dbContext.Sample中的项,其中item.locId请尝试以下操作
var data = from item in dbContect.Sample
where (item.locId > 100 && ddlGender == 1) ||
(item.locId < 100 && ddlGender != 1)
select item
var data=来自dbContect.Sample中的项
式中(item.locId>100&&ddlGender==1)|
(item.locId<100&&ddlegender!=1)
选择项
试试这个
var data = from item in dbContect.Sample
where (item.locId > 100 && ddlGender == 1) ||
(item.locId < 100 && ddlGender != 1)
select item
var data=来自dbContect.Sample中的项
式中(item.locId>100&&ddlGender==1)|
(item.locId<100&&ddlegender!=1)
选择项
另一个选项是使用过滤器和三元运算符组合查询:
var data = dbContext.Sample;
data = (ddlGender == 1) ? data.Where(i => i.locId > 100)
: data.Where(i => i.locId < 100);
如果您要添加复杂条件,它将被转换为SQL
(item.locId > 100 && ddlGender == 1) || (item.locId < 100 && ddlGender != 1)
(item.locId>100&&ddlGender==1)| |(item.locId<100&&ddlGender!=1)
将转换为以下带有两个参数的查询(假设数据库中有不可为空的字段locId)
选择[Extent1].[locId]作为[locId],
[Extent1].[Foo]作为[Foo],
[extend1].[Bar]作为[Bar]
从[dbo].[Sample]到[Extent1]
其中([Extent1].[locId]>100)和(1=@p_linq_0)和(@p_linq_0不为空))
或([Extent1].[locId]<100)和
(NOT((1=@p_linq_1)和(@p_linq_1不为NULL)))
另一个选项是使用过滤器和三元运算符组合查询:
var data = dbContext.Sample;
data = (ddlGender == 1) ? data.Where(i => i.locId > 100)
: data.Where(i => i.locId < 100);
如果您要添加复杂条件,它将被转换为SQL
(item.locId > 100 && ddlGender == 1) || (item.locId < 100 && ddlGender != 1)
(item.locId>100&&ddlGender==1)| |(item.locId<100&&ddlGender!=1)
将转换为以下带有两个参数的查询(假设数据库中有不可为空的字段locId)
选择[Extent1].[locId]作为[locId],
[Extent1].[Foo]作为[Foo],
[extend1].[Bar]作为[Bar]
从[dbo].[Sample]到[Extent1]
其中([Extent1].[locId]>100)和(1=@p_linq_0)和(@p_linq_0不为空))
或([Extent1].[locId]<100)和
(NOT((1=@p_linq_1)和(@p_linq_1不为NULL)))
在这里,您无法避免某种情况。除非必要,否则不要进行优化。此代码不是瓶颈的来源,即使您避免了这种情况,您也不会获得任何好处。我不确定您为什么要“优化”去掉if
语句。与数据访问相比,它几乎是瞬时的。我认为你得到的很好。你想如何在没有条件语句的情况下编程?这是每种编程语言的基础。我在考虑Lambda表达式,但由于ddlegender
不在查询范围内,因此试图解决我们的问题在查询中,它需要一个if
子句。在这里你不能避免某种情况。除非必要,否则不要进行优化。这段代码不是瓶颈的来源,即使你避免了这种情况,你也不会得到任何东西。我不确定你为什么要“优化”去掉if
语句。与数据访问相比,它几乎是瞬时的。我认为你得到的很好。你想如何在没有条件语句的情况下编程?这是每种编程语言的基础。我在考虑Lambda表达式,但由于ddlegender
不在查询范围内,因此试图解决我们的问题e查询内部需要一个if
子句+1来删除if-else,但这会影响性能,因为对每个项执行的条件都会增加吗?如果目的是在linq中有一个查询,这是一个可能的解决方案。对于增加的性能,取决于表中有多少项。可能有如果只有几行,则可以忽略少量的增加。我认为此代码的性能将比原始代码差。原始代码将导致在数据库上执行两个简单查询中的一个,具体取决于ddlegender
的值。此代码不必将决策推送到数据库服务器,从而生成更复杂的查询。+1表示r如果不是,这会影响性能吗?如果目的是在linq中有一个查询,这是一个可能的解决方案。对于增加的性能,取决于表中有多少项。如果只有几行,可能会有一个小的增加,可以忽略不计。我认为这是一个可行的解决方案de的性能比原始代码差。原始代码将导致在数据库上执行两个简单查询中的一个,具体取决于ddlegender
的值。此代码不需要将决策推送到数据库服务器,从而生成更复杂的查询。+1。这并不是真正的“优化”原始代码(虽然这是非常优化的),但它更简短、更整洁。@BenM谢谢!事实上,我说的是优化代码,这里的另一个答案有-当你在where语句中添加所有条件时,我将更新答案,使其指向:)+1。这并不是真的“优化”原始代码(这是非常优化的),但它又短又整洁。@BenM谢谢!事实上,我刚才说的是优化代码,这里的另一个答案是——当你们在where语句中添加所有条件时,我会更新答案,使之更简洁:)