在我的示例中,我想要获取促销代码名称的促销元素,如果没有提供名称,则采取所有可用的促销活动。
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”是否为空。有没有人能建议一个正确的方法呢?
发布于 2012-10-31 04:15:27
首先,删除将始终返回每一行的|| 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,所以thing-we-know- is -t-null在左边;尽管根据数据类型的不同,Equals(x,y)或x == y可能更可取。
发布于 2012-10-31 04:15:50
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或空,则不会执行行过滤。
另一种选择(我认为fluent界面在这里看起来更好):
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 { ... });https://stackoverflow.com/questions/13146857
复制相似问题