我可以在Linq中的Where及OrderBy中使用字串嗎?
可以使用 System.Linq.Dynamic 來達成哦!
有朋友問使用LINQ排序時,可以給物件的屬性字串,來達到排序的功能。
例如在 DataGridView 的 Header Click 後,可依 Header 對應的物件屬性來排序。如下,
這時亂馬客找到可以使用 System.Linq.Dynamic 來達到這個功能。它允許在 Where 及 OrderBy 裡使用字串。
所以可以在 Nuget 中 Search 「System.Linq.Dynamic」,安裝對應的版本,就可以使用它了!
先定義 Identity Class 測試用,
public class Identity
{
public string Prop1 { get; set; }
public int MyProperty2 { get; set; }
[DisplayName("帳號")]
public string Account { get; set; }
public int Id { get; set; }
}
在Form上使用它,畫面上拉一個name為 dgv_CYC,
然後在 dataGridView 的 ColumnHeaderMouseClick 事件中處理排序的事,如下,
private void Form1_Load(object sender, EventArgs e)
{
List<Identity> data = new List<Identity>()
{ new Identity { Prop1 = "1", Account = "Rainmaker", Id = 0 } ,
new Identity { Prop1 = "2", Account = "sss", Id = 1 } ,
new Identity { Prop1 = "3", Account = "aaa", Id = 2 }
};
this.dgv_CYC.DataSource = data;
}
private string orderColumn = string.Empty ;
private string ordering = string.Empty;
private const string descending = "desc";
private void dgv_CYC_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
string columnName = dgv_CYC.Columns[e.ColumnIndex].Name;
if (string.IsNullOrWhiteSpace(orderColumn)) {
orderColumn = columnName;
ordering = descending;
}
else
{
if(orderColumn.Equals(columnName, StringComparison.InvariantCultureIgnoreCase)){
ordering = string.IsNullOrWhiteSpace(ordering) ? descending : string.Empty;
}else{
orderColumn = columnName;
ordering = string.Empty;
}
}
string orderExpression = string.Format("{0} {1}", orderColumn, ordering);
List<Identity> Mcycs = dgv_CYC.DataSource as List<Identity>;
var mcycs = Mcycs.AsQueryable().OrderBy(orderExpression).Select(c => c);
dgv_CYC.DataSource = mcycs.ToList();
}
參考資料
Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library)
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^