[.NET]使用 System.Linq.Dynamic 來達到依不同屬性排序

我可以在Linq中的Where及OrderBy中使用字串嗎?
可以使用 System.Linq.Dynamic 來達成哦!

有朋友問使用LINQ排序時,可以給物件的屬性字串,來達到排序的功能。

例如在 DataGridView 的 Header Click 後,可依 Header 對應的物件屬性來排序。如下,

image

 

這時亂馬客找到可以使用 System.Linq.Dynamic 來達到這個功能。它允許在 Where 及 OrderBy 裡使用字串。

所以可以在 Nuget 中 Search 「System.Linq.Dynamic」,安裝對應的版本,就可以使用它了!

image

 

先定義 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();  
}

image

參考資料

System.Linq.Dynamic

Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library)

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^