求指导。大神过来关照一下。sql语句对应 lambel 表达式的写法

laokaizzz 2014-06-26 11:00:53
//想实现的sql语句如下:
// select a.id,a.name,b.id as childid,b.parentid,b.name as childname from a inner join b on a.id=b.parentid where childname!="aaa" and childid>100

//主要的问题在于 我想先连接再写where条件,可是不想新建一个实体类,所以返回值采用动态类,但是动态类的话,where里面就不知道怎么写了。求高手指教

public List<TResult> TestManyTable<TResult>(Expression<Func<TableAModel, TableBModel, TResult>> resultSelector, Expression<Func<TResult, bool>> exWhere)
{
using (SysDb<TableAModel, TableBModel> db = new SysDb<TableAModel, TableBModel>(Config.DataConnString))
{
return db.Set<TableAModel>().Join(db.Set<TableBModel>(),
c => c.Id, d => d.ParentId, resultSelector).Where(exWhere).ToList();
}
}

//调用
List<dynamic> aa = jyweb.TestManyTable<dynamic>(((c, d) => new { c.Id, c.Name, ChildId = d.Id, ChildName = d.Name }),f=>(f.ChildId>1));//这里报错,提示表达式数不能包含动态操作
var bb= aa.Count;

...全文
523 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
laokaizzz 2016-07-11
  • 打赏
  • 举报
回复
引用 28 楼 timothy888 的回复:
别来无恙哈
timothy888 2015-08-28
  • 打赏
  • 举报
回复
laokaizzz 2014-06-26
  • 打赏
  • 举报
回复
解决参考:http://www.cnblogs.com/happyhippy/archive/2010/01/26/1656961.html 好文
laokaizzz 2014-06-26
  • 打赏
  • 举报
回复
自己顶一下
laokaizzz 2014-06-26
  • 打赏
  • 举报
回复
使用了一个实体类,再加上使用上面链接文章中的方法DynamicWhere实现。 单独用动态类没能实现,单独用一个实体类,也不行,因为单独加的这个实体类没有映射到数据库实体。需要使用链接文章中的方法。 暂时这么解决吧。
laokaizzz 2014-06-26
  • 打赏
  • 举报
回复
引用 24 楼 u010349035 的回复:
[quote=引用 23 楼 laokaizzz 的回复:] [quote=引用 22 楼 u010349035 的回复:] 你要返回list的话通用的方法根本就写不出来的,list里面的实体没办法确定
恩恩,不想单独写类,又想实现,所以问问看。不行的话,就只能建一个类,再考虑怎么实现了。[/quote] lz,还是单独写吧,通用方法不是这么容易就写出来滴[/quote] 恩恩,不行,我就只能这样了。再放一天,不行的话,结贴。
laokaizzz 2014-06-26
  • 打赏
  • 举报
回复
另外单表的话,动态查询是可以实现的。用PredicateBuilder 可以的。
-烟花雨季 2014-06-26
  • 打赏
  • 举报
回复
引用 23 楼 laokaizzz 的回复:
[quote=引用 22 楼 u010349035 的回复:] 你要返回list的话通用的方法根本就写不出来的,list里面的实体没办法确定
恩恩,不想单独写类,又想实现,所以问问看。不行的话,就只能建一个类,再考虑怎么实现了。[/quote] lz,还是单独写吧,通用方法不是这么容易就写出来滴
laokaizzz 2014-06-26
  • 打赏
  • 举报
回复
引用 22 楼 u010349035 的回复:
你要返回list的话通用的方法根本就写不出来的,list里面的实体没办法确定
恩恩,不想单独写类,又想实现,所以问问看。不行的话,就只能建一个类,再考虑怎么实现了。
-烟花雨季 2014-06-26
  • 打赏
  • 举报
回复
你要返回list的话通用的方法根本就写不出来的,list里面的实体没办法确定
laokaizzz 2014-06-26
  • 打赏
  • 举报
回复
引用 19 楼 u010349035 的回复:
是这样子的
public List<实体> GetInfo()
        {
            var query = from a in DbContext.table1
                        from b in DbContext.table2
                        where a.id = b.parentid
                        select new
                        {
                            id = a.id,
                            name = a.name,
                            childid = b.id,
                            parentid = b.parentid,
                            childname = b.name
                        };
            return query.ToList();
        }
这一段就是两表查询出来的数据,单独写成一个方法 然后在表现层判断,先调用方法 TableService ts = new TableService(); List<实体> list = ts.GetInfo(); 比如你有一个name条件 if (!string.IsNullOrEmpty(name)) { list = list.Where(p => p.name.Contains(name)); } 完毕,要什么条件再加就行
List<实体> list = ts.GetInfo(); 就是这句,我的意思就是这里不用额外建一个两表都有字段的实体类,而是用dynamic 动态类,怎么实现。 我在一楼就说了 “//主要的问题在于 我想先连接再写where条件,可是不想新建一个实体类,所以返回值采用动态类,但是动态类的话,where里面就不知道怎么写了。求高手指教” 只不过你没搞清楚我在问的是啥。感谢你的回答。谢谢你的祝福。
-烟花雨季 2014-06-26
  • 打赏
  • 举报
回复
引用 18 楼 laokaizzz 的回复:
[quote=引用 17 楼 u010349035 的回复:] 艾玛,在这挖坑呢
不是挖坑,是我试过了,不行。条件写在数据层不是不可以 可是有的多表查询,是有很多条件,也有很多表达式,有大于,等于,小于,包含。在后台写判断语句的话,要写很多个,不通用,想搞一个公共的方法,界面层根据需要拼接条件传入到后台,后台负责查询就行。 我是认认真真的在研究问题,没打算坑谁。[/quote]你有很多表要查询,有很多条件,有很多表达式肯定要写多个方法啊,这东西还能通用?我是没写过的,要什么数据就写什么方法,写不成通用的,lz,祝你好运,我写不出来,如果你写出来了还请告知
-烟花雨季 2014-06-26
  • 打赏
  • 举报
回复
是这样子的
public List<实体> GetInfo()
        {
            var query = from a in DbContext.table1
                        from b in DbContext.table2
                        where a.id = b.parentid
                        select new
                        {
                            id = a.id,
                            name = a.name,
                            childid = b.id,
                            parentid = b.parentid,
                            childname = b.name
                        };
            return query.ToList();
        }
这一段就是两表查询出来的数据,单独写成一个方法 然后在表现层判断,先调用方法 TableService ts = new TableService(); List<实体> list = ts.GetInfo(); 比如你有一个name条件 if (!string.IsNullOrEmpty(name)) { list = list.Where(p => p.name.Contains(name)); } 完毕,要什么条件再加就行
laokaizzz 2014-06-26
  • 打赏
  • 举报
回复
引用 17 楼 u010349035 的回复:
艾玛,在这挖坑呢
不是挖坑,是我试过了,不行。条件写在数据层不是不可以 可是有的多表查询,是有很多条件,也有很多表达式,有大于,等于,小于,包含。在后台写判断语句的话,要写很多个,不通用,想搞一个公共的方法,界面层根据需要拼接条件传入到后台,后台负责查询就行。 我是认认真真的在研究问题,没打算坑谁。
-烟花雨季 2014-06-26
  • 打赏
  • 举报
回复
艾玛,在这挖坑呢
laokaizzz 2014-06-26
  • 打赏
  • 举报
回复
引用 14 楼 u010349035 的回复:
[quote=引用 13 楼 laokaizzz 的回复:] [quote=引用 10 楼 u010349035 的回复:] 没说要你写在一个层里面啊,你把这一堆写在其他层里面,然后界面层调用这个方法就可以了啊,只要把参数传进去就可以了,大哥,麻烦你动动脑好不好,把“childname”、“childid”作为方法的参数
哎,脑子笨,没办法。真心不是伸手党,我试了一天了。 我知道你说的方法,我的意思是,想条件是动态的,随意的在前台进行拼接后传入,包括匿名类型也想通过前台传入,因为不同的时候需要的字段不一样,条件也是。 你估计没有仔细看我给你的网址里的内容。 单表的话,我可以办到,多表的话,我就没办法这么做。感谢你的回答,我知道你的意思,我再想想吧。[/quote] where 后面的要通过前台传入?那就把两表的数据查出来以后再where也可以啊,跟方法里面写一样的也是这样 if (!string.IsNullOrEmpty(childname)) { query = query.Where(p => p.childname.Contains(childname)); }[/quote] 那就把两表的数据查出来以后再where也可以啊 你单独把他写成一个方法,放到另外一层,运行通过的话,我立马结贴。
-烟花雨季 2014-06-26
  • 打赏
  • 举报
回复
跟那个链接的帖子有半毛钱关系嘛?还不都是一样的方法,表连接加where查询
-烟花雨季 2014-06-26
  • 打赏
  • 举报
回复
引用 13 楼 laokaizzz 的回复:
[quote=引用 10 楼 u010349035 的回复:] 没说要你写在一个层里面啊,你把这一堆写在其他层里面,然后界面层调用这个方法就可以了啊,只要把参数传进去就可以了,大哥,麻烦你动动脑好不好,把“childname”、“childid”作为方法的参数
哎,脑子笨,没办法。真心不是伸手党,我试了一天了。 我知道你说的方法,我的意思是,想条件是动态的,随意的在前台进行拼接后传入,包括匿名类型也想通过前台传入,因为不同的时候需要的字段不一样,条件也是。 你估计没有仔细看我给你的网址里的内容。 单表的话,我可以办到,多表的话,我就没办法这么做。感谢你的回答,我知道你的意思,我再想想吧。[/quote] where 后面的要通过前台传入?那就把两表的数据查出来以后再where也可以啊,跟方法里面写一样的也是这样 if (!string.IsNullOrEmpty(childname)) { query = query.Where(p => p.childname.Contains(childname)); }
laokaizzz 2014-06-26
  • 打赏
  • 举报
回复
引用 10 楼 u010349035 的回复:
没说要你写在一个层里面啊,你把这一堆写在其他层里面,然后界面层调用这个方法就可以了啊,只要把参数传进去就可以了,大哥,麻烦你动动脑好不好,把“childname”、“childid”作为方法的参数
哎,脑子笨,没办法。真心不是伸手党,我试了一天了。 我知道你说的方法,我的意思是,想条件是动态的,随意的在前台进行拼接后传入,包括匿名类型也想通过前台传入,因为不同的时候需要的字段不一样,条件也是。 你估计没有仔细看我给你的网址里的内容。 单表的话,我可以办到,多表的话,我就没办法这么做。感谢你的回答,我知道你的意思,我再想想吧。
-烟花雨季 2014-06-26
  • 打赏
  • 举报
回复
然后我跟你说一下哦,join跟查询两个表加where条件效果是一样的
加载更多回复(9)

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧