接下来的获取和以前上可查询
哟怎么了帮派分子?
我有以下的代码,这似乎返回空
始终。
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.