在如下的 Linq 语句中(缩小到问题的相关部分):
var sites = from s in DataContext.Sites
join add in DataContext.Address
on s.PrimaryAddress equals add into sa
from a in sa.DefaultIfEmpty()
select new {
s.Id,
s.SiteName,
PrimaryAddress = a
};
我们遇到的问题是,最终基于 GridView/LinqDataSource 组合的控件无法在 PrimaryAddress 连接类上正确排序(忽略它)。对于像这样的所有加入的类,我们都看到了相同的行为。GridView 有什么办法来处理这个问题吗? 或者,有没有一种通过表达式的方法,我们可以在动态 OrderBy 的代码中处理它?
附加说明: 添加时.OrderBy(s => s.PrimaryAddress)
我们得到Cannot order by type 'Address'
,当.OrderBy(gs => gs.PrimaryBusinessAddress.AddressLine1)
我们得到Specified method is not supported.
对 LinqDataSource.OrderBy 本身进行排序时,为时已晚......它只对当前页面上的记录进行排序,而不是对整个集合进行排序。
为清楚起见,这是网格中地址的格式:
public partial class Address
{
public override string ToString()
{
return string.Format("{0} {1}{2} {3}",
AddressLine1,
City,
!string.IsNullOrEmpty(State) && State != "None" ? ", " + State : string.Empty,
!string.IsNullOrEmpty(Country) ? string.Format("({0})", Country) : string.Empty);
}
}
如果我们可以按 排序AddressLine1 + City + State + Country
,那就足够了,但我不确定如何通过表达式树来做到这一点......无论我们通过表达式指定什么 OrderBy,它都会恢复为按s.SiteName排序(默认排序在网格上)。在我们的网格控件中显示的像这样的连接类的数量非常有限,每个都有一个开关和表达式案例根本不是问题。关于解决方案或完全不同的方法的任何想法?