0

在我的示例中,如果未提供名称,我想获取提供的促销代码名称的促销元素,然后获取所有可用的促销。

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”是否为空。任何人都可以提出正确的方法吗?

4

2 回答 2

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所以我们知道的东西不是空的在左边;尽管取决于数据类型,Equals(x,y)或者x == y可能更可取。

于 2012-10-30T20:15:26.517 回答
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一个filterValue为 null 或为空,则不会执行行过滤。

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

var query = promoCodes.AsEnumerable();

if (!String.IsNullOrEmpty(fieldTitle) && !String.IsNullOrEmpty(fieldValue))
    query = query.Where(row => row[fieldTitle].Equals(filterValue));

var result = query.Select(row => new PromoCodeInfoContainer { ... });
于 2012-10-30T20:15:49.567 回答