我正在尝试用 LINQ 编写搜索查询。下面是 where 条件。
where (!string.IsNullOrEmpty(nameWithInitials)
&& tb.NameWithInitials.Contains(nameWithInitials))
&& (!string.IsNullOrEmpty(studentRegNo)
&& tbSR.StudentRegistrationNo.Contains(studentRegNo))
&& (!string.IsNullOrEmpty(NIC) && tb.NIC.Contains(NIC))
&& (!string.IsNullOrEmpty(fullName) && tbi.Name.Contains(fullName))
如果我传递单个参数,它不会返回任何值。例如,如果我传递"Chamara"作为全名,它不会返回任何结果,但如果我一次传递所有参数,那么它会返回匹配的记录。
即使我动态传递多个参数,我也需要让它工作
你在任何地方都使用 AND(&&
),所以如果这些条件中至少有一个是假的,你的where
条件将是假的。请尝试改用 OR 条件:
where (string.IsNullOrEmpty(nameWithInitials) || tb.NameWithInitials.Contains(nameWithInitials))
&& (string.IsNullOrEmpty(studentRegNo) || tbSR.StudentRegistrationNo.Contains(studentRegNo))
&& (string.IsNullOrEmpty(NIC) || tb.NIC.Contains(NIC))
&& (string.IsNullOrEmpty(fullName) || tbi.Name.Contains(fullName))
在这种情况下,在任何这些条件下,如果您有空参数,则只会计算条件的第一部分,否则将评估第二个条件。
一个潜在的问题是实体框架可能无法将其转换为实际的 SQL。在这种情况下,您可以使用以下方法:
var query = // your original query without where condition
// Check if the condition is valid and only then add where condition
if(!string.IsNullOrEmpty(nameWithInitials))
{
query = query.Where(tb => tb.NameWithInitials.Contains(nameWithInitials));
}
// repeat this for all other conditions
你问的是半混乱的,但我认为你想搜索每个字符串(如果存在),这转化为
where ((string.IsNullOrEmpty(nameWithInitials)
|| tb.NameWithInitials.Contains(nameWithInitials))
&& (string.IsNullOrEmpty(studentRegNo)
|| tbSR.StudentRegistrationNo.Contains(studentRegNo))
&& (string.IsNullOrEmpty(NIC) || tb.NIC.Contains(NIC))
&& (string.IsNullOrEmpty(fullName) || tbi.Name.Contains(fullName))