首页 新闻 会员 周边

LinQ动态拼接

0
悬赏园豆:10 [已解决问题] 解决于 2013-12-04 15:26

方法中有两个参数: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;
}

呓语鑫的主页 呓语鑫 | 菜鸟二级 | 园豆:313
提问于:2013-12-04 14:16
< >
分享
最佳答案
0
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表达式,来消除你代码冗余,也容易阅读代码

收获园豆:10
秋壶冰月 | 大侠五级 |园豆:5903 | 2013-12-04 14:58

看懂了意思.就是没有写过Func和lambda..不知道调用方法,有没有哪里有资料看的?或者先告诉我下这个方法的调用.很急 .麻烦了哦   分先给你了啊

 

呓语鑫 | 园豆:313 (菜鸟二级) | 2013-12-04 15:26

@呓语星辰: 这个方法是自己封装的!不是泛型的,稍微一改,把T换成你要操作的实体类,S也换成你要操作实体类,就可以了,

秋壶冰月 | 园豆:5903 (大侠五级) | 2013-12-04 15:40

@秋壶冰月: 把S去掉,把T换成你操作的实体就行了

秋壶冰月 | 园豆:5903 (大侠五级) | 2013-12-04 15:45

@秋壶冰月: 这个我改好了.只是不知道怎么生成 Func<Sample, bool> whereLambda, Func<Sample, string> orderByLambda,这两个参数.能告诉我这两个参数分别代表什么吗?

呓语鑫 | 园豆:313 (菜鸟二级) | 2013-12-04 15:50
_examService.GetPagerEntites(pageSize, pageIndex, out totals, e => e.ExamId <= 100, e => e.ExamId, true);
//e=>e.ExamId  取ExamId小于等于100 就是方法内的whereLambda  其实就是where条件
//就是ExamId排序 //true 就是升序 false代表降序

 

@呓语星辰: 

秋壶冰月 | 园豆:5903 (大侠五级) | 2013-12-04 15:59

@秋壶冰月: 哦哦 ,,了解了...是这样调用的.谢了哦.终于解决了

呓语鑫 | 园豆:313 (菜鸟二级) | 2013-12-04 16:01

@呓语星辰: 嗯,那就好,要不然还准备给你写demo呢!这样看来不用了

秋壶冰月 | 园豆:5903 (大侠五级) | 2013-12-04 16:03

@秋壶冰月: 亲     有个地方难倒了....在有条件的时候的拼接我没看懂.

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);
}

我知道这样肯定错了,但是不知道怎么改

呓语鑫 | 园豆:313 (菜鸟二级) | 2013-12-04 16:29

@秋壶冰月: 我写成了这个样子.排序这样写的.然后那个条件还是不会拼接.排序正确的写法应该是怎么样的?以为懂了,看来还是不大懂.先做出来.今晚回去再看看具体的资料

呓语鑫 | 园豆:313 (菜鸟二级) | 2013-12-04 16:50

@秋壶冰月: 条件判断添加好了   ,,使用+= 就好了.开始是自己傻了下,把条件写错.呵呵,看到就帮我想想我的这个排序字段应该怎么写好点.这个是我最后整理的.

呓语鑫 | 园豆:313 (菜鸟二级) | 2013-12-04 17:23

@呓语星辰: 

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;
            }
//和你的差不多
秋壶冰月 | 园豆:5903 (大侠五级) | 2013-12-04 17:37

@秋壶冰月: 

亲,麻烦看下这样写对不对.为什么多条件的拼接  使用+=无效果.

呓语鑫 | 园豆:313 (菜鸟二级) | 2013-12-19 10:46

@呓语星辰: whereLambda是lambda表达式,而不是字符串,怎么能进行拼接呢

秋壶冰月 | 园豆:5903 (大侠五级) | 2013-12-19 12:44

@秋壶冰月: 嗯,现在知道了.我现在写的固定的,根据条件判断,生成对应的Lambda.只是感觉可能有点繁琐.Lambda有没有类似拼接这种操作啊?我截图我的做法,这样是不是很笨?

呓语鑫 | 园豆:313 (菜鸟二级) | 2013-12-19 17:01

@秋壶冰月: 大神,我也有个关于linq的问题,已经发了博问了,能抽空帮忙看看吗?

moiam | 园豆:136 (初学一级) | 2016-09-08 16:48
其他回答(1)
0

自己定义委托,然后传入就行了,这里的参数应该是委托了

Rookier | 园豆:652 (小虾三级) | 2013-12-04 14:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册