使用或不使用where子句执行LINQ

时间:2012-10-30 20:09:48

标签: c# linq

在我的示例中,我希望获得促销代码名称的促销元素,如果未提供名称则提供该促销代码名称,然后获取所有可用的促销信息。

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技术,如果没有提供条件,则OR将是不影响选择的任何内容(|| true)。在linq中这不起作用,它总是返回所有条目而不管“fieldTitle”和“filterValue”是否为空。任何人都可以提出正确的方法吗?

2 个答案:

答案 0 :(得分:2)

首先,删除|| true - 将始终返回每一行 - 因此问题。

执行此操作的一个好方法是组合 - 这样就可以避免在有值时为每一行测试fieldTitle / fieldValue,或者每行执行任何操作。他们是空白的:

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,以便左边的东西 - 我们知道 - 不是null;虽然取决于数据类型,Equals(x,y)x == y可能更受欢迎。

答案 1 :(得分:1)

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
             };

如果fieldTitle的{​​{1}}为空或空,则不会执行行过滤。

另一种选择(我认为流畅的界面在这里看起来更好):

filterValue