首页 新闻 搜索 专区 学院

求将sql翻译成linq

0
悬赏园豆:100 [已解决问题] 解决于 2014-11-27 10:15


这个表就是留言表,我要用行号计算楼层,但是只加载MsgState="0"的数据 

我要先生成行号,在获取数据
就是所有MsgState的数据都要计算到行号里,
但是只取MsgState='0'的数据

求解linq 该如何书写,写过
Hsuwen的主页 Hsuwen | 初学一级 | 园豆:10
提问于:2014-11-25 17:04
< >
分享
最佳答案
0

Select有一个重载,后面表达式的Func里面的二个就是索引,就是你要的RowNumber

public static IQueryable<TResult> Select<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, int, TResult>> selector);

收获园豆:50
achu.me | 小虾三级 |园豆:877 | 2014-11-27 09:55

非常感谢您,之前我也用这个方法,但是说不支持该类型什么的,后来发现是linq to entity里应该先AsEnumerable(),昨天晚上解决了,用的就是这个重载。

Hsuwen | 园豆:10 (初学一级) | 2014-11-27 10:09

@Hsuwen: 嗯,解决了就行。

achu.me | 园豆:877 (小虾三级) | 2014-11-27 10:15
其他回答(6)
0

我一般都用Linqpad,很简单的。网址:LinqPad

收获园豆:5
Mr.Brian | 园豆:1518 (小虾三级) | 2014-11-25 17:10

能帮我翻译下这句吗?

支持(0) 反对(0) Hsuwen | 园豆:10 (初学一级) | 2014-11-25 17:12

刚刚用了下这个工具,还不错,能解析linq成sql并能看到结果,但是怎么能将我写的sql换成linq呢?

支持(0) 反对(0) Hsuwen | 园豆:10 (初学一级) | 2014-11-25 18:13
0

LINQ不支持RowNumber的,再说了,楼层这个数据哪有在查询 的时候才生成的,保存的时候就应该保存下来的。

收获园豆:5
爱编程的大叔 | 园豆:30664 (高人七级) | 2014-11-25 17:15

首先不说linq能不能RowNumber,但是我个人认为能sql查询或者计算出来的为什么非要存贮进去呢?而且存储进去的时候也是要经过计算的,还可能伴随并发的问题。

另外,http://bbs.csdn.net/topics/390310745这里有个类似的例子,只不过我菜鸟,模仿不出来

支持(0) 反对(2) Hsuwen | 园豆:10 (初学一级) | 2014-11-25 17:58

@Hsuwen: 

哈,你喜欢就好。说多了你不明白。

支持(1) 反对(0) 爱编程的大叔 | 园豆:30664 (高人七级) | 2014-11-25 18:00

@爱编程的大叔: 谢谢

支持(0) 反对(0) Hsuwen | 园豆:10 (初学一级) | 2014-11-25 18:01

@爱编程的大叔: 是可以实现RowNumber的哦,用select的这个重载public static IQueryable<TResult> Select<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, int, TResult>> selector);在l2e中要先AsEnumerable()一下哦

支持(0) 反对(0) Hsuwen | 园豆:10 (初学一级) | 2014-11-27 10:12
0
db.SysMsgArticle.Where(x=>x.FromID==100057 &&x.MsgState==0).OrderBy(x=>x.MsgDate).ThenBy(x=>x.MsgID)
收获园豆:5
幻天芒 | 园豆:36594 (高人七级) | 2014-11-25 17:31

这个不对吧,我要的是先不过滤MsgState生成序号,再筛选数据。而且你这个也没序号

支持(0) 反对(0) Hsuwen | 园豆:10 (初学一级) | 2014-11-25 17:53

@Hsuwen:你拿序号有用?要么动态SQL,要么把所有数据拿到后台代码中处理。

支持(0) 反对(0) 幻天芒 | 园豆:36594 (高人七级) | 2014-11-25 23:37
1

定义个 零时对象或者把行号num字段加到实体里,用 ef执行sql语句。

var query=db.SqlQuery<SysMsg>("SELECT ROW_NUMBER() OVER(order by u...) num,.... FROM .....");

收获园豆:30
Qlin | 园豆:2403 (老鸟四级) | 2014-11-25 18:01

想到了,这个是最后的退路吧。谢谢

支持(0) 反对(0) Hsuwen | 园豆:10 (初学一级) | 2014-11-25 18:02
0

var a = list.Skip(0).Take(count).Where(x => x.FromID.Equals("1") && x.state == 11).OrderBy(x => x.state).ThenBy(x => x.FromID);

收获园豆:5
田麦成 | 园豆:1984 (小虾三级) | 2014-11-25 18:14

首先这样都没有行号呀

支持(0) 反对(0) Hsuwen | 园豆:10 (初学一级) | 2014-11-25 18:14

@Hsuwen: 行号一般在页面根据当前页,和每页的条数计算。

支持(0) 反对(0) 悟行 | 园豆:12240 (专家六级) | 2014-11-25 18:45

@ArnoldZhang: 那肯定不对吧,我希望的行号是根据所有数据来的,如果根据上面的查询结果,那行号肯定对不上呀

支持(0) 反对(0) Hsuwen | 园豆:10 (初学一级) | 2014-11-25 19:04

@Hsuwen: 行号就是在当前页和每页的条数计算出来的。肯定能对上。

支持(0) 反对(0) forhells | 园豆:969 (小虾三级) | 2014-11-26 08:42

@forhells: 
好比这个数据,按照上面的查询,是先过滤MsgState,然后再排序,这样生成的序号都是在所有符合条件的MsgState的数据上生成的,那我怎么知道中间有多少不符合条件的数据呢?请仔细看上面的描述!而且,上面的linq就是个普通的where查询、排序。谢谢

支持(0) 反对(0) Hsuwen | 园豆:10 (初学一级) | 2014-11-26 08:55
0

该问题已经测试解决,结合问题描述,在实际情况下又关联了几个表,代码如下

var tmps = dal.Context.SysMsgGuess
.Join(dal.Context.SysUser, v => v.UserNum, h => h.UserNum, (v, h) => new
{
MsgID = v.MsgID,
FromID = v.FromID,
MsgImage = v.MsgImage,
MsgUsing = v.MsgUsing,
MsgContent = v.MsgContent,
MsgDate = v.MsgDate,
MsgPai = v.MsgPai,
MsgZan = v.MsgZan,
MsgState = v.MsgState,
UserNum = v.UserNum,
UserHeader = h.UserPic,
UserState = h.UserStatus
})
.Where(v => v.FromID == guessID)
.OrderByDescending(v => v.MsgDate)
.ThenBy(v => v.MsgID)
.AsEnumerable()
.Select((v, i) => new
{
MsgFloor = i + 1,
MsgID = v.MsgID,
FromID = v.FromID,
MsgImage = v.MsgImage,
MsgUsing = v.MsgUsing,
MsgContent = v.MsgContent,
MsgDate = v.MsgDate,
MsgPai = v.MsgPai,
MsgZan = v.MsgZan,
MsgState = v.MsgState,
UserNum = v.UserNum,
UserHeader = v.UserHeader,
UserState = v.UserState
})
.Where(v => v.MsgState == "0" && v.UserState == "0")
.Select(v => new ComMsgGuess
{
MsgFloor = v.MsgFloor,
MsgID = v.MsgID,
FromID = v.FromID,
MsgImage = v.MsgImage,
MsgUsing = v.MsgUsing,
MsgContent = v.MsgContent,
MsgDate = v.MsgDate,
MsgPai = v.MsgPai,
MsgZan = v.MsgZan,
MsgState = v.MsgState,
UserNum = v.UserNum,
UserHeader = v.UserHeader
})
.AsQueryable()
.ToPageList(pageIndex, pageSize);

Hsuwen | 园豆:10 (初学一级) | 2014-11-27 10:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册