2009-09-30 197 views
7

我使用C#.NETLINQ WHERE使用if语句

我有两个文本框,如果它!空需要一个LINQ查询中的WHERE子句的一部分条款。

这里是我的代码

var result = from a in xxxx select a; 

if(!string.IsNullOrEmpty(personName)) 
{ 
    return result.Where(a >= a.forename.Contains(personName) || a.surname.Contains(personName)  
} 
else if(!string.IsNullOrEmpty(dateFrom)) 
{ 
    return result.Where(a >= a.appStartDateTime >= dateFrom.Date) 
} 
else if(!string.IsNullOrEmpty(personName) && !string.IsNullOrEmpty(dateFrom)) 
{ 
    return result.Where(a >= a.forename.Contains(personName) || a.surname.Contains(personName) && a.appStartDateTime >= dateFrom.Date); 
} 

我认为这会工作,但它不喜欢的。哪里,我不能访问“A”例如a.forename(名称“一个”不在当前的情况下存在)

我该怎么做,或者实际上不能做到这一点?

在此先感谢您的帮助。

克莱尔

+1

如果你将永远不会碰到最后的其他人。如果最后一个如果将是真的,那么第一个如果是真的。所以你不能到最后一个。 – 2009-09-30 12:40:28

+0

我现在把它们变成了所有if语句。 – ClareBear 2009-09-30 13:43:25

+0

@ClareBear如果他们仍然有返回语句在他们那么它不会帮助。你将永远不会碰到检查两个条件的最后一条if语句。你仍然只会从第一个返回。我也会重新排序它们,以便personName && dateFrom的检查不为空或空的检查首先发生。 – 2009-09-30 13:49:25

回答

6

取而代之的是:

result.Where(a.forename.Contains(personName)) 

试试这个:

result.Where(a => a.forename.Contains(personName)) 

你似乎缺少拉姆达操作符(=>)。

+0

我想我读,因为它位于一个if语句,它不能访问任何东西之外,不知道如果这是真的吗?由于我仍然得到“名称”一个'在当前上下文错误中不存在“ – ClareBear 2009-09-30 11:00:59

+0

你能发布你现在更新的代码吗? – RichardOD 2009-09-30 11:11:06

+0

我用更新后的代码更新了我的问题。 – ClareBear 2009-09-30 11:23:01

1

..或者只有一个出口点:

var result = from a in xxxx select a; 

Func<string, bool> func = null; 

if(!string.IsNullOrEmpty(personName)) 
{ 
func = (a) => {a.forename.Contains(personName) || a.surname.Contains(personName)};  
} 

else if(!string.IsNullOrEmpty(dateFrom)) 
{ 
func = (a) => {a.appStartDateTime >= dateFrom.Date}; 
} 

else if(!string.IsNullOrEmpty(personName) && !string.IsNullOrEmpty(dateFrom)) 
{ 
func = (a) => {a.forename.Contains(personName) || a.surname.Contains(personName) && a.appStartDateTime >= dateFrom.Date;}; 
} 

return result.Where(func); 
2

试试这个


var result = from a in xxxx select a 
    where (string.IsNullOrEmpty(personName) || a.forename.Contains(personName) 
      || a.surname.Contains(personName)) 
      && (string.IsNullOrEmpty(dateFrom) 
      || a.appStartDateTime >= DateTime.Parse(dateFrom).Date); 

dateFrom似乎是一个字符串,所以你必须分析它获得一个约会时间。

这个逻辑应该可以工作,但我还没有测试过。我可能是错的。

如果personName不为null或为空,您似乎只关心如果姓或名包含personName。因此,如果personName为null或为空或者fore或sur名称包含人名,则可以重写它以返回事物。自||以来运营商短路它不会检查包含如果personName为空或空。

2

您还可以结合谓词,使逻辑更短,更易于阅读:

var result = from a in xxxx select a; 

if (!string.IsNullOrEmpty(personName)) 
    result = result.Where(a => a.forename.Contains(personName) || a.surname.Contains(personName) 

if (!string.IsNullOrEmpty(dateFrom)) 
    result = result.Where(a >= a.appStartDateTime >= dateFrom.Date) 

return result; 

结合谓词的这种方法适用与“AND”条件。如果您需要“或”条件,则需要多一点参与。值得庆幸的是,Joe Albahari创建了PredicateBuilder(作为LINQKit的一部分),这对此非常有帮助。

希望这会有所帮助。