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更早。如果我错了,请纠正我。你们要杀了我,伙计们。马克-解决方案,懒惰-投票。感谢你们两位,感谢你们这么快的回复!