这个表就是留言表,我要用行号计算楼层,但是只加载MsgState="0"的数据
Select有一个重载,后面表达式的Func里面的二个就是索引,就是你要的RowNumber
public static IQueryable<TResult> Select<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, int, TResult>> selector);
非常感谢您,之前我也用这个方法,但是说不支持该类型什么的,后来发现是linq to entity里应该先AsEnumerable(),昨天晚上解决了,用的就是这个重载。
@Hsuwen: 嗯,解决了就行。
LINQ不支持RowNumber的,再说了,楼层这个数据哪有在查询 的时候才生成的,保存的时候就应该保存下来的。
首先不说linq能不能RowNumber,但是我个人认为能sql查询或者计算出来的为什么非要存贮进去呢?而且存储进去的时候也是要经过计算的,还可能伴随并发的问题。
另外,http://bbs.csdn.net/topics/390310745这里有个类似的例子,只不过我菜鸟,模仿不出来
@Hsuwen:
哈,你喜欢就好。说多了你不明白。
@爱编程的大叔: 谢谢
@爱编程的大叔: 是可以实现RowNumber的哦,用select的这个重载public static IQueryable<TResult> Select<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, int, TResult>> selector);在l2e中要先AsEnumerable()一下哦
db.SysMsgArticle.Where(x=>x.FromID==100057 &&x.MsgState==0).OrderBy(x=>x.MsgDate).ThenBy(x=>x.MsgID)
这个不对吧,我要的是先不过滤MsgState生成序号,再筛选数据。而且你这个也没序号
@Hsuwen:你拿序号有用?要么动态SQL,要么把所有数据拿到后台代码中处理。
定义个 零时对象或者把行号num字段加到实体里,用 ef执行sql语句。
var query=db.SqlQuery<SysMsg>("SELECT ROW_NUMBER() OVER(order by u...) num,.... FROM .....");
想到了,这个是最后的退路吧。谢谢
var a = list.Skip(0).Take(count).Where(x => x.FromID.Equals("1") && x.state == 11).OrderBy(x => x.state).ThenBy(x => x.FromID);
首先这样都没有行号呀
@Hsuwen: 行号一般在页面根据当前页,和每页的条数计算。
@ArnoldZhang: 那肯定不对吧,我希望的行号是根据所有数据来的,如果根据上面的查询结果,那行号肯定对不上呀
@Hsuwen: 行号就是在当前页和每页的条数计算出来的。肯定能对上。
@forhells:
好比这个数据,按照上面的查询,是先过滤MsgState,然后再排序,这样生成的序号都是在所有符合条件的MsgState的数据上生成的,那我怎么知道中间有多少不符合条件的数据呢?请仔细看上面的描述!而且,上面的linq就是个普通的where查询、排序。谢谢
该问题已经测试解决,结合问题描述,在实际情况下又关联了几个表,代码如下
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);