我有一个场景,我使用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);
答案 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))