LINQ WHERE子句使用if语句

7

我正在使用c#.net。

我有两个文本框,如果不为空,则需要成为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);
}

我以为这个方法可以用,但是它不喜欢.Where,而且我无法访问'a',例如a.forename(名称“a”在当前上下文中不存在)

我错在哪里了,或者实际上不能这样做?

非常感谢您的帮助。

克莱尔


1
你永远不可能触发最后一个 else if。如果最后一个 else if 为 true,那么第一个 if 也一定为 true。因此,你不可能到达最后一个 else if。 - Mike Two
我现在已经把它们都转换成了if语句。 - ClareBear
如果它们仍然在其中包含返回语句,那么它将无济于事。你永远不会遇到最后一个if语句,该语句检查两个条件。你仍然只会从第一个返回。我还会重新排序它们,以便首先检查personName && dateFrom不为null或空的情况。 - Mike Two
4个回答

6

不要这样写:

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

试试这个:

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

您似乎缺少Lambda运算符(=>)。


我认为我读取它是因为它位于if语句中,不能访问其外部任何内容,不确定是否正确?因为我仍然收到“名称'a'在当前上下文中不存在”的错误。 - ClareBear
你使用了">="而不是"=>"。 - RichardOD

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,如果personName不为null或空,则可以重写它以返回内容。因为||运算符是短路的,如果personName为null或为空,它不会检查Contains。


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”条件时效果很好。如果您需要使用“OR”条件,则需要更多的操作。值得庆幸的是,Joe Albahari创建了PredicateBuilder(作为LINQKit的一部分),这可以极大地帮助解决问题。

希望这能有所帮助。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接