我正在尝试使用具有多个表的LINQ2SQL对GridView进行排序。由于网格中的列包含来自多个表的数据,如何告诉LINQ要对哪个列名进行排序。
例如,用户点击表POCNum
中的第一列(p
),因此我会将p.POCNum
用于orderby
。问题是e.SortExpressio
n只包含单词POCNum
。无法将此链接回表p
。因此,如果有人点击表Contact_ID
中的列c
,我需要在LINQ查询中orderby c.Contact_ID
。
任何建议都将不胜感激。
protected void GridView1_Sort(Object sender, GridViewSortEventArgs e)
{
DataClasses1DataContext db = new DataClasses1DataContext();
var results = (from p in db.POCs<BR/>
join c in db.Contacts on p.POC_ID equals c.POC_ID
join a in db.Auxilaries on p.POC_ID equals a.POC_ID
join l in db.Legends on p.Basis equals l.Legend_code_value
orderby e.SortExpression // problem -
//e.SortExpression does not contain table reference
where p.DebtorObj_ID == Convert.ToInt32(ddlDebtor.SelectedItem.Value)
select new { p.POC_ID, p.POC_Date, p.POCNum, p.Total_Amt, p.Secure_Amt,
a.AMailing_Name1, l.Legend_Description }).ToList();
GridView1.DataSource = results;
GridView1.DataBind();
}
答案 0 :(得分:1)
我要看的是表达式或动态linq。
如果您在http://www.singingeels.com/Articles/Self_Sorting_GridView_with_LINQ_Expression_Trees.aspx处看到通用分拣机,或在http://devtoolshed.com/content/gridview-objectdatasource-linq-paging-and-sorting中看到应该有用的通用分拣机。
对于动态linq,请参阅Is there a pattern using Linq to dynamically create a filter?这是关于过滤器的,但同样适用于排序。请注意,您的匿名类型没有重复的列名,因此多表源无关紧要
在通用排序器中的示例之后,在GridView的排序处理程序中(显式实现,而不是LINQ查询,但这不重要):
IEnumerable<CustomerOrder> customerOrders = (LINQ statement)
var param = Expression.Parameter = typeof(CustomerOrder));
var sortExpression = Expression.Lambda<Func<CustomerOrder, object>>(Expression.Convert(Expression.Property(param,e.SortExpression), typeof(object), param);
MyGridView.DataSource = customerOrders.AsQueryable().OrderBy(sortExpression);
MyGridView.DataBind();