首页新闻找找看学习计划

linq可以查询条件可以用string拼接吗?

0
[已解决问题] 解决于 2018-09-27 12:06
string  condition ="p.name=='小红';
 var item = items.Where(p=> condition);

如代码,这是我的构想,但无法实现,有没有实现办法?

你猜丶的主页 你猜丶 | 菜鸟二级 | 园豆:390
提问于:2018-09-13 17:40
< >
分享
最佳答案
0
    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
你猜丶 | 菜鸟二级 |园豆:390 | 2018-09-27 12:05
其他回答(2)
0

再简单一下感觉就没了啊

华临天下 | 园豆:1165 (小虾三级) | 2018-09-13 17:45

啥?

 

支持(0) 反对(0) 你猜丶 | 园豆:390 (菜鸟二级) | 2018-09-13 17:46

@你猜丶: 代码就没了

支持(0) 反对(0) 华临天下 | 园豆:1165 (小虾三级) | 2018-09-13 17:46

@华临天下: 不是不是啊var item = items.Where(p=> condition);这样不行的啊,condition下面会出现红杠杠

支持(0) 反对(0) 你猜丶 | 园豆:390 (菜鸟二级) | 2018-09-13 17:49

@你猜丶: 这种方法挺新颖的,没有用过。。。。

支持(0) 反对(0) 华临天下 | 园豆:1165 (小虾三级) | 2018-09-13 17:51

@华临天下: 嗯啊,郁闷,因为我的那个查询条件得循环出来,而且不是and 是 or,所以才想能不能这样实现。

支持(0) 反对(0) 你猜丶 | 园豆:390 (菜鸟二级) | 2018-09-13 17:54

@你猜丶: 要不使用SQL拼接吧

支持(0) 反对(0) 华临天下 | 园豆:1165 (小虾三级) | 2018-09-13 17:56

@华临天下: 额,我都不晓得这个怎么用sql,我只用过linq

支持(0) 反对(0) 你猜丶 | 园豆:390 (菜鸟二级) | 2018-09-13 17:58

@你猜丶: 网上百度一下你的问题看看有什么好的解决方法啊?

支持(0) 反对(0) 华临天下 | 园豆:1165 (小虾三级) | 2018-09-13 17:59

我是这样的,首先一张表,然后有一个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不能拼接不晓得怎么做。

支持(0) 反对(0) 你猜丶 | 园豆:390 (菜鸟二级) | 2018-09-13 18:04

@你猜丶: 这个在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();
你这样试试看,能不能筛选出来

支持(0) 反对(0) 华临天下 | 园豆:1165 (小虾三级) | 2018-09-14 09:47
0

有,不过你自己设计一门语言,自己写一个编译器.就能高兴了

吴瑞祥 | 园豆:28569 (高人七级) | 2018-09-13 19:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册