string condition ="p.name=='小红'; var item = items.Where(p=> condition);
如代码,这是我的构想,但无法实现,有没有实现办法?
public static class PredicateBuilder { public static Expression<Func<T, bool>> True<T>() { return f => true; } public static Expression<Func<T, bool>> False<T>() { return f => false; } public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) { var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>()); return Expression.Lambda<Func<T, bool>> (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters); } public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) { var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>()); return Expression.Lambda<Func<T, bool>> (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters); } public static Predicate<T> ConvertToPredicate<T>(this Func<T, bool> func) { return new Predicate<T>(func); } }
var pre = PredicateBuilder.False<Item>(); foreach (var cd in catalogs) { var cataPre = PredicateBuilder.True<Item>(); if (!string.IsNullOrWhiteSpace(cd.BrandCd)) { cataPre = cataPre.And((item) => item.BrandCd == cd.BrandCd); } if (!string.IsNullOrWhiteSpace(cd.NameCd)) { cataPre = cataPre.And((item) => item.NameCd == cd.NameCd); } pre = pre.Or(cataPre); }
//true拼接and,false拼接or
再简单一下感觉就没了啊
啥?
@你猜丶: 代码就没了
@华临天下: 不是不是啊var item = items.Where(p=> condition);这样不行的啊,condition下面会出现红杠杠
@你猜丶: 这种方法挺新颖的,没有用过。。。。
@华临天下: 嗯啊,郁闷,因为我的那个查询条件得循环出来,而且不是and 是 or,所以才想能不能这样实现。
@你猜丶: 要不使用SQL拼接吧
@华临天下: 额,我都不晓得这个怎么用sql,我只用过linq
@你猜丶: 网上百度一下你的问题看看有什么好的解决方法啊?
我是这样的,首先一张表,然后有一个list<model>,然后查询满足List<model>里面的一条, 数据就可以留下来。
list<model>条件:
items=[{
code="123",name="小红",
code="122",name="小蓝",
code="121",name="小绿",
}];
然后表中也这两个字段,只要一条数据中,code,name对应的到,满足list中一条,就可以留下来
本来我按照以前sql的思路就是可以用string拼接,循环做(teble.name=item[1].name and teble.code=item[1].code) or (teble.name=item[2].name and teble.code=item[2].code)
现在换成Linq不能拼接不晓得怎么做。
@你猜丶: 这个在SQL中就是exist的筛选条件,在Linq中
var list1=表中的数据;
var list2=list<model>里面的数据
var list = (from l1 in list1
where list2.Any(c => c.code == l1.code && c.name == l1.name)
select l1
).ToList();
你这样试试看,能不能筛选出来
有,不过你自己设计一门语言,自己写一个编译器.就能高兴了