GridView使用带有多个表的LINQ2SQL进行排序

时间:2012-03-08 15:07:58

标签: c# asp.net

我正在尝试使用具有多个表的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();
}

1 个答案:

答案 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();