c#lambda表达式如果条件在where里面

时间:2018-04-05 00:04:05

标签: c# lambda

我有一个场景,我使用lambda表达式按名称,地址和电话号码过滤数据。但是当一个属性没有值时,我的过滤器会考虑属性为null的位置,并给出错误的结果。如果属性为null,是否有任何选项可以使用if条件从三种情况中删除where条件。我的意思是有没有添加where / check只有具有值的属性的对象?

var filterCriteria ={
name: "abc",
address:"",
phone:""
}

var Details = _context.LogEntities
                    .Where(p => p.name == (filterCriteria.name))
                    .Where(p => p.address== (filterCriteria.address))
                    .Where(p => p.phone== (filterCriteria.phone))

                return Json(Details);

3 个答案:

答案 0 :(得分:5)

如果您仍希望在姓名,地址或电话为空时返回记录,则只需在条件中检查是否为空。

var Details = _context.LogEntities
                    .Where(p => p.name == null || p.name == (filterCriteria.name))
                    .Where(p => p.address == null || p.address == (filterCriteria.address))
                    .Where(p => p.phone == null || p.phone == (filterCriteria.phone))

                return Json(Details);

答案 1 :(得分:2)

您可以编写一个扩展方法来有条件地应用过滤器:

public static IQueryable<T> WhereIf<T>(
   this IQueryable<T> source, bool condition, 
   Expression<Func<T, bool>> predicate)
{
    if (condition)
        return source.Where(predicate);
    else
        return source;
}

您的查询变为:

using static System.String;

...

var employees = _context
   .LogEntities
   .WhereIf(!IsNullOrEmpty(filterCriteria.name), e => e.name == filterCriteria.name)
   .WhereIf(!IsNullOrEmpty(filterCriteria.address), e => e.address == filterCriteria.address)
   .WhereIf(!IsNullOrEmpty(filterCriteria.phone), e => e.phone == filterCriteria.phone)
   .ToList();

答案 2 :(得分:1)

进行过滤时,如果你想要的是在过滤器中考虑null属性以匹配集合中相应属性中的any值,则应该针对过滤器属性检查null,而不是在集合项的属性上。所以对于像

这样的集合
var myCollection = [
{name: "abc",address:"qwerty",phone:"123"},
{name: "abc",address:"xyz",phone:"456"},
{name: "efg",address:"cde",phone:"654"}]

并过滤

var filterCriteria ={name: "abc",address:"",phone:""}

具有所需的结果,如:

[{name: "abc",address:"qwerty",phone:"123"},
{name: "abc",address:"xyz",phone:"456"}]

您的代码应为

var Details = _context.LogEntities
                .Where(p => (filterCriteria.name) == null || p.name == (filterCriteria.name))
                .Where(p => (filterCriteria.address) == null || p.address== (filterCriteria.address))
                .Where(p => (filterCriteria.phone) == null || p.phone== (filterCriteria.phone))