C# 使用where子句或不使用where子句执行LINQ
在我的示例中,我希望为提供的促销代码名称获取促销元素,如果未提供名称,则获取所有可用促销C# 使用where子句或不使用where子句执行LINQ,c#,linq,C#,Linq,在我的示例中,我希望为提供的促销代码名称获取促销元素,如果未提供名称,则获取所有可用促销 var result = from row in promoCodes.AsEnumerable() where ( !String.IsNullOrEmpty(fieldTitle) && !String.IsNullOrEmpty(filterValue) &&
var result = from row in promoCodes.AsEnumerable()
where (
!String.IsNullOrEmpty(fieldTitle) &&
!String.IsNullOrEmpty(filterValue) &&
row[fieldTitle].Equals(filterValue)
) || true
select new PromoCodeInfoContainer
{
BannerLink = row["BannerLink"] as string
....
};
我试着遵循SQL技术,如果没有提供条件,那么就不会影响选择(| | true)。在linq中,这不起作用,它总是返回所有条目,不管“fieldTitle”和“filterValue”是否为空。有人能提出一个正确的方法吗?首先,删除
|true
——它将始终返回每一行——因此出现了问题
一种很好的方法是合成,这样就不需要在每一行有值时测试每一行的字段标题
/字段值
,或者在每一行为空时执行任何操作:
var query = promoCodes.AsEnumerable();
if(!string.IsNullOrEmpty(fieldTitle) && !string.IsNullOrEmpty(fieldValue))
{
query = from row in query
where filterValue.Equals(row[fieldTitle])
select row;
}
var result = from row in query
select new PromoCodeInfoContainer {...}
注意,我还颠倒了
等于
,这样我们知道的东西不是空的在左边;尽管取决于数据类型,Equals(x,y)
或x==y
可能更可取。首先,删除将始终返回每一行的| true
,因此出现问题
var result = from row in promoCodes.AsEnumerable()
where String.IsNullOrEmpty(fieldTitle) ||
String.IsNullOrEmpty(filterValue) ||
row[fieldTitle].Equals(filterValue)
select new PromoCodeInfoContainer
{
BannerLink = row["BannerLink"] as string
};
一种很好的方法是合成,这样就不需要在每一行有值时测试每一行的字段标题
/字段值
,或者在每一行为空时执行任何操作:
var query = promoCodes.AsEnumerable();
if(!string.IsNullOrEmpty(fieldTitle) && !string.IsNullOrEmpty(fieldValue))
{
query = from row in query
where filterValue.Equals(row[fieldTitle])
select row;
}
var result = from row in query
select new PromoCodeInfoContainer {...}
注意,我还颠倒了等于
,这样我们知道的东西不是空的在左边;尽管取决于数据类型,等于(x,y)
或x==y
可能更可取
var result = from row in promoCodes.AsEnumerable()
where String.IsNullOrEmpty(fieldTitle) ||
String.IsNullOrEmpty(filterValue) ||
row[fieldTitle].Equals(filterValue)
select new PromoCodeInfoContainer
{
BannerLink = row["BannerLink"] as string
};
如果filterValue
的fieldTitle
为null或空,则不会执行行筛选
另一种选择(我认为流畅的界面在这里看起来更好):
如果filterValue
的fieldTitle
为null或空,则不会执行行筛选
另一种选择(我认为流畅的界面在这里看起来更好):
嗯,
| | true
看起来是返回每一行的一个很好的理由……是的@marcGravel这就是问题所在。我要说做两个语句,一个检查promo元素,然后第二个检查是否没有找到。马克和@lazyberezovsky在我使用的同一时间给出了类似的解决方案,效果非常好。我用了lazy的方式让它看起来更优雅,但Marc更早。如果我错了,请纠正我。你们要杀了我,伙计们。马克-解决方案,懒惰-投票。感谢你们两位,感谢你们这么快的回复!嗯,| | true
看起来是返回每一行的一个很好的理由……是的@marcGravel这就是问题所在。我要说做两个语句,一个检查promo元素,然后第二个检查是否没有找到。马克和@lazyberezovsky在我使用的同一时间给出了类似的解决方案,效果非常好。我用了lazy的方式让它看起来更优雅,但Marc更早。如果我错了,请纠正我。你们要杀了我,伙计们。马克-解决方案,懒惰-投票。感谢你们两位,感谢你们这么快的回复!