方法中有两个参数:1.排序字段(sortColumn);2.升序或降序(SortDirection).
希望大神帮我写成动态的linQtoEntity. LinQ没用几天不会.希望的效果是如下:
1.var all = ctx.Samples.Where(t => t).OrderByDescending(sortColumn);
2.var all = ctx.Samples.Where(t => t).OrderBy(sortColumn);
源码贴下面.
switch (sortColumn)
{
case "STAT":
if (SortDirection != "Descending")
{
all = all.OrderByDescending(d => d.STAT).Skip((PageIndex - 1) * pageSize).Take(pageSize).Select(t => t);
break;
}
all = all.OrderBy(d => d.STAT).Skip((PageIndex - 1) * pageSize).Take(pageSize).Select(t => t);
break;
case "Status":
if (SortDirection != "Descending")
{
all = all.OrderByDescending(d => d.Status).Skip((PageIndex - 1) * pageSize).Take(pageSize).Select(t => t);
break;
}
all = all.OrderBy(d => d.Status).Skip((PageIndex - 1) * pageSize).Take(pageSize).Select(t => t);
break;
case "SID":
if (SortDirection != "Descending")
{
all = all.OrderByDescending(d => d.SID).Skip((PageIndex - 1) * pageSize).Take(pageSize).Select(t => t);
break;
}
all = all.OrderBy(d => d.SID).Skip((PageIndex - 1) * pageSize).Take(pageSize).Select(t => t);
break;
case "Name":
if (SortDirection != "Descending")
{
all = all.OrderByDescending(d => d.Name).Skip((PageIndex - 1) * pageSize).Take(pageSize).Select(t => t);
break;
}
all = all.OrderBy(d => d.Name).Skip((PageIndex - 1) * pageSize).Take(pageSize).Select(t => t);
break;
case "SampleType":
if (SortDirection != "Descending")
{
all = all.OrderByDescending(d => d.SampleType).Skip((PageIndex - 1) * pageSize).Take(pageSize).Select(t => t);
break;
}
all = all.OrderBy(d => d.SampleType).Skip((PageIndex - 1) * pageSize).Take(pageSize).Select(t => t);
break;
case "EndTime":
if (SortDirection != "Descending")
{
all = all.OrderByDescending(d => d.CreateTime).Skip((PageIndex - 1) * pageSize).Take(pageSize).Select(t => t);
break;
}
all = all.OrderBy(d => d.CreateTime).Skip((PageIndex - 1) * pageSize).Take(pageSize).Select(t => t);
break;
default:
if (SortDirection != "Descending")
{
all = all.OrderByDescending(d => d.ID).Skip((PageIndex - 1) * pageSize).Take(pageSize).Select(t => t);
break;
}
all = all.OrderBy(d => d.ID).Skip((PageIndex - 1) * pageSize).Take(pageSize).Select(t => t);
break;
}
public IQueryable<T> GetPagerEntites<S>(int pageSize, int pageIndex, out int total, Func<T, bool> whereLambda, Func<T, S> orderByLambda, bool isAsc) { var temp = _dbContext.CreateObjectSet<T>().Where(whereLambda); total = temp.Count(); if (isAsc) { temp = temp.OrderBy(orderByLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize); } else { temp = temp.OrderByDescending(orderByLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize); } return temp.AsQueryable(); }
通过泛型和泛型委托Func和lambda表达式,来消除你代码冗余,也容易阅读代码
看懂了意思.就是没有写过Func和lambda..不知道调用方法,有没有哪里有资料看的?或者先告诉我下这个方法的调用.很急 .麻烦了哦 分先给你了啊
@呓语星辰: 这个方法是自己封装的!不是泛型的,稍微一改,把T换成你要操作的实体类,S也换成你要操作实体类,就可以了,
@秋壶冰月: 把S去掉,把T换成你操作的实体就行了
@秋壶冰月: 这个我改好了.只是不知道怎么生成 Func<Sample, bool> whereLambda, Func<Sample, string> orderByLambda,这两个参数.能告诉我这两个参数分别代表什么吗?
_examService.GetPagerEntites(pageSize, pageIndex, out totals, e => e.ExamId <= 100, e => e.ExamId, true); //e=>e.ExamId 取ExamId小于等于100 就是方法内的whereLambda 其实就是where条件
//就是ExamId排序 //true 就是升序 false代表降序
@呓语星辰:
@秋壶冰月: 哦哦 ,,了解了...是这样调用的.谢了哦.终于解决了
@呓语星辰: 嗯,那就好,要不然还准备给你写demo呢!这样看来不用了
@秋壶冰月: 亲 有个地方难倒了....在有条件的时候的拼接我没看懂.
Func<Sample, bool> aList= sample => sample.Status=="运行中" || sample.Status == "等待";
if (String.IsNullOrEmpty(SampleType) || SampleType == "全部")
{
aList = sample => sample.SampleType == SampleType;
}
if (String.IsNullOrEmpty(SID))
{
aList = sample => sample.SID.Contains(SID);
}
我知道这样肯定错了,但是不知道怎么改
@秋壶冰月: 我写成了这个样子.排序这样写的.然后那个条件还是不会拼接.排序正确的写法应该是怎么样的?以为懂了,看来还是不大懂.先做出来.今晚回去再看看具体的资料
@秋壶冰月: 条件判断添加好了 ,,使用+= 就好了.开始是自己傻了下,把条件写错.呵呵,看到就帮我想想我的这个排序字段应该怎么写好点.这个是我最后整理的.
@呓语星辰:
Expression<Func<Student, object>> orderByLambda; switch (order) { case "Name": orderByLambda = o => o.Name; break; case "Score": orderByLambda = o => o.Score; break; case "Source": orderByLambda = o => o.Source; break; default: orderByLambda = o => o.Id; break; } //和你的差不多
@秋壶冰月:
亲,麻烦看下这样写对不对.为什么多条件的拼接 使用+=无效果.
@呓语星辰: whereLambda是lambda表达式,而不是字符串,怎么能进行拼接呢
@秋壶冰月: 嗯,现在知道了.我现在写的固定的,根据条件判断,生成对应的Lambda.只是感觉可能有点繁琐.Lambda有没有类似拼接这种操作啊?我截图我的做法,这样是不是很笨?
@秋壶冰月: 大神,我也有个关于linq的问题,已经发了博问了,能抽空帮忙看看吗?
自己定义委托,然后传入就行了,这里的参数应该是委托了