我正在尝试创建一个页面和排序对象数据源,在执行之前返回所有结果,然后在过滤之前对这些结果进行排序,然后使用take和skip方法,目的是从数据库中仅检索结果的一部分(节省数据库流量)。这是基于以下文章:
http://www.singingeels.com/Blogs/Nullable/2008/03/26/Dynamic_LINQ_OrderBy_using_String_Names.aspx
现在我已经设法让这个工作甚至创建lambda表达式来反映从网格返回的排序表达式,甚至找出数据类型以对DateTime和Decimal进行排序。
public static string GetReturnType<TInput>(string value)
{
var param = Expression.Parameter(typeof(TInput), "o");
Expression a = Expression.Property(param, "DisplayPriceType");
Expression b = Expression.Property(a, "Name");
Expression converted = Expression.Convert(Expression.Property(param, value), typeof(object));
Expression<Func<TInput, object>> mySortExpression = Expression.Lambda<Func<TInput, object>>(converted, param);
UnaryExpression member = (UnaryExpression)mySortExpression.Body;
return member.Operand.Type.FullName;
}
现在我遇到的问题是许多查询返回连接表,我想对其他表中的字段进行排序。
因此,在执行查询时,您可以创建一个函数,将其他表中的属性分配给在分部类中创建的属性。
public static Account InitAccount(Account account)
{
account.CurrencyName = account.Currency.Name;
account.PriceTypeName = account.DisplayPriceType.Name;
return account;
}
所以我的问题是,有没有办法将连接表中的值赋给当前表分部类的属性?我尝试过使用。
from a in dc.Accounts
where a.CompanyID == companyID
&& a.Archived == null
select new {
PriceTypeName = a.DisplayPriceType.Name})
但这似乎弄乱了我的SortExpression。
对此的任何帮助都会非常感激,我知道这很复杂。
答案 0 :(得分:1)
这是一个功能性编程的东西。通过做出任务来改变账户是不对的。新建一个你想要的形状的新实例。
步骤1:声明一个具有所需结果形状的类:
public class QueryResult
{
public int CompanyID {get;set;}
public string CurrencyName {get;set;}
public string PriceTypeName {get;set;}
}
第2步:在查询中投射到该课程
from ...
where ...
select new QueryResult()
{
CompanyID = a.CompanyID,
CurrencyName = a.Currency.Name,
PriceTypeName = a.PriceType.Name
};
第3步:获利! (按此顺序)
查询生成器将使用QueryResult类型的详细信息生成具有该形状的select子句。