接下来的获取和以前上可查询 [英] Getting next and previous on a Queryable

查看:100
本文介绍了接下来的获取和以前上可查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

哟怎么了帮派分子?

我有以下的代码,这似乎返回始终。

I have the following code which seems to return null always.

    public static T GetNext<T>(this IQueryable<T> list, T current)
    {
        try
        {
            return list.SkipWhile(x => !x.Equals(current)).Skip(1).First();
        }
        catch
        {
            return default(T);
        }
    }

    public static T GetPrevious<T>(this IQueryable<T> list, T current)
    {
        try
        {
            return list.TakeWhile(x => !x.Equals(current)).Last();
        }
        catch
        {
            return default(T);
        }
    }



给定一个可查询从数据源,并在记录它,我只是想获得下一个和以前的值。

Given a Queryable from a data source and a record in it, I just want to get the next and previous values.

推荐答案

原因是 SkipWhile 不被支持的EntityFramework。

The cause is that SkipWhile is not supported by EntityFramework.

首先,使用跳过集合必须有一些,以便使的EntityFramework支持该方法。
所以,方法调用之前,你需要有排序依据方法:

First, to use Skip or Take the collection must be some in order to make EntityFramework support that methods. So, before method call, you need to have OrderBy method:

 var orderedList = list.OrderBy(elem => elem.Id) // or other property 
                                                // but need to be rememebered
                                                // because it will be used in furher

然后你的下一个方法可能是某事像这样:

Then your method for next could be sth like this:

public static T GetNext<SomeEntity>(
            this IOrderedQueryable<SomeEntity> list,
            SomeEntity current)
{
    return list.Where(elem => elem.Id > current.Id)
               .FirstOrDefault(); // faster than try-catch
     // assuming, that Id is unique
}

这方法有一个缺点。这不是通用。但随着一点点努力,你可以准备一个通用版本:

That method has one drawback. It is not generic. But with a little effort,you can prepare a generic version:

public static T GetNext<T>(this IOrderedQueryable<T> list, T current, string orderProperty)
{
    var predicate = string.Format("{0} > @0", orderProperty);
    var propValue = current.GetType()
                           .GetProperty(orderProperty, 
                                        BindingFlags.Public | BindingFlags.Instance)
                           .GetValue(current);
    return (T)list.Where(predicate, propValue).FirstOrDefault();
                  //where comes from System.Linq.Dynamic
}

如果您不喜欢的字符串作为属性格式的名称:

If you don't like strings as propery names:

public static T GetNext<T>(this IOrderedQueryable<T> list, 
                          T current, 
                          Func<T, object> orderProperty)
{
    ..
    var propValue = orderProperty(current);
    ..
}

和用法:

orderedList.GetNext(current, orderProperty: elem => elem.Id);



上的通用版本继电器 System.Linq.Dynamic ,可以发现在 CodePlex上

我希望它给你一些线索如何使你的代码的工作或一些想法如何与其他方法实现它。

I hope it gives you some clue how to make your code work or some idea how to implement it with other approach.

这篇关于接下来的获取和以前上可查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆