gpt4 book ai didi

c# - 在 Queryable 上获取下一个和上一个

转载 作者:行者123 更新时间:2023-11-30 14:53:19 26 4
gpt4 key购买 nike

你怎么了黑帮?

我有以下代码似乎总是返回 null

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

给定一个来自数据源的 Queryable 和其中的一条记录,我只想获取下一个和上一个值。

最佳答案

原因是EntityFramework不支持SkipWhile

首先,要使用SkipTake 集合必须是一些以使EntityFramework 支持该方法。所以,在方法调用之前,你需要有 OrderBy 方法:

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

那么你下一步的方法可能是这样的:

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
}

该方法有一个缺点。它不是通用的。但是稍加努力,您就可以准备一个通用版本:

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
}

如果您不喜欢将字符串作为属性名:

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 上找到

我希望它能为您提供一些线索,让您了解如何使您的代码正常工作,或者了解如何使用其他方法来实现它。

关于c# - 在 Queryable 上获取下一个和上一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29765174/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com