0

介绍

假设我有这些课程:

public class Door {
    public string Label { get; set; }
}

public class House {
    public string Address { get; set; }
    public Door FrontDoor { get; set; }
}

现在,这些是数据库中的简单模型,使用 Entity Framework 4 进行抽象。因此,当我需要制作有序列表时,House我可以使用:

dbObjectContext.Houses.OrderBy(h=>h.Name);

然后,如果我想按 订购FrontDoor.Label,我可以使用:

dbObjectContext.Houses.OrderBy(h=>h.FrontDoor.Label);

问题

我打算制作一种旨在由 WPF DataGrid 使用的排序方法,该方法将显示房屋列表。方法签名如下:

IOrderedQueryable<TEntity> ApplySortingToQuery<TEntity>(bool ascending
    ,IQueryable<TEntity> finderQuery,string propertyPath)

我想使用对象类型和属性访问路径字符串的知识来构建OrderBy表达式。TEntitypropertyPath

在 DataGrid 中,要排序的对象是 type House,它的列是AddressFront Door Label。现在,DataGrid 中的Address列已SortMemberPath设置为Address。而前门标签列是FrontDoor.Label.

一开始,我可以只使用if-else来确定要使用的OrderBy表达式,例如:

if (col.SortMemberPath=="Address") {
    query=query.OrderBy(h=>h.Address);
} else if (col.SortMemberPath=="FrontDoor.Label") {
    query=query.OrderBy(h=>h.FrontDoor.Label);
}

但是,恕我直言,此功能非常通用。因此,执行此操作的实用程序函数将SortMemberPath像在该方法中一样咨询和使用它,propertyPath这对于将使用它的许多其他应用程序来说将是一个很大的帮助。

我已经咨询过这种技术,它可以帮助我在一定程度上实现这个实用功能,但只有直接属性访问是成功的(即:)Address,但访问子属性(即:)FrontDoor.Label并不成功。

请指导我。

4

1 回答 1

0

该技术一直在网络中......(一如既往)

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

现在,我只需要使用 编译一个 DLL CSharpSamples.zip\LinqSamples\DynamicQuery\DynamicQuery\Dynamic.cs,使System.Linq.Dynamic命名空间可用。那么,方法实现就会变得非常简单。

重要的关键字是dynamic query…… 有时很难找到正确问题的正确关键字。

于 2013-02-15T09:33:56.113 回答