gpt4 book ai didi

c# - 强类型动态 Linq 排序

转载 作者:IT王子 更新时间:2023-10-29 04:21:43 32 4
gpt4 key购买 nike

我正在尝试构建一些代码来动态排序 Linq IQueryable<>。

这里有一个明显的方法,它使用字段名称的字符串对列表进行排序
http://dvanderboom.wordpress.com/2008/12/19/dynamically-composing-linq-orderby-clauses/

但是我想要一个改变——字段名称的编译时检查,以及使用重构/查找所有引用来支持以后维护的能力。这意味着我想将字段定义为 f=>f.Name,而不是字符串。

对于我的特定用途,我想封装一些代码,这些代码将根据用户输入决定应该使用命名“OrderBy”表达式列表中的哪一个,而无需每次都编写不同的代码。

这是我写的内容的要点:

var list = from m Movies select m; // Get our list

var sorter = list.GetSorter(...); // Pass in some global user settings object

sorter.AddSort("NAME", m=>m.Name);
sorter.AddSort("YEAR", m=>m.Year).ThenBy(m=>m.Year);

list = sorter.GetSortedList();

...
public class Sorter<TSource>
...
public static Sorter<TSource> GetSorter(this IQueryable<TSource> source, ...)

GetSortedList 函数确定使用哪些命名排序,这会产生一个 List 对象,其中每个 FieldData 包含在 AddSort 中传递的字段的 MethodInfo 和 Type 值:

public SorterItem<TSource> AddSort(Func<T, TKey> field)
{
MethodInfo ... = field.Method;
Type ... = TypeOf(TKey);
// Create item, add item to diction, add fields to item's List<>
// The item has the ThenBy method, which just adds another field to the List<>
}

我不确定是否有一种方法可以以一种允许稍后返回的方式存储整个字段对象(因为它是泛型类型,所以无法转换)

有没有一种方法可以修改示例代码,或者提出全新的代码,以便在 将它们存储在某个容器中并检索(丢失任何泛型类型转换)

最佳答案

最简单的方法是让您的 AddSort() 函数采用 Expression > 而不仅仅是 Func。这允许您的排序方法检查表达式以提取出您要排序的属性的名称。然后您可以将该名称作为字符串在内部存储,因此存储非常容易,您可以使用您链接到的排序算法,但您还可以获得类型安全和编译时检查是否有效的属性名称。

static void Main(string[] args)
{
var query = from m in Movies select m;

var sorter = new Sorter<Movie>();
sorter.AddSort("NAME", m => m.Name);
}

class Sorter<T>
{
public void AddSort(string name, Expression<Func<T, object>> func)
{
string fieldName = (func.Body as MemberExpression).Member.Name;
}
}

在这种情况下,我使用对象作为 func 的返回类型,因为它很容易自动转换,但如果您需要更多功能,您可以根据需要使用不同的类型或泛型来实现它。在这种情况下,由于 Expression 仅供检查,因此并不重要。

另一种可能的方法是仍然采用 Func,并将其存储在字典本身中。然后,当涉及到排序时,您需要获取要排序的值,您可以这样调用:

// assuming a dictionary of fields to sort for, called m_fields
m_fields[fieldName](currentItem)

关于c# - 强类型动态 Linq 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/557819/

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