在我的示例中,我希望获得促销代码名称的促销元素,如果未提供名称则提供该促销代码名称,然后获取所有可用的促销信息。
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”是否为空。任何人都可以提出正确的方法吗?
答案 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