我有一個對象訂單(訂單,產品,成本,價格,客戶,日)。我正在從數據庫中檢索大量記錄並為了便於過濾,我需要使用檢索到的不同值來丟棄DropDownLists,以便用戶只能選擇特定日期或特定產品甚至特定價格。 DropDownList的ID創建為“ddl_”+相關字段的名稱。
我想要的是能夠像這樣定義一個簡單的數組:
public string[] filterArray = new string[] { "Order", "Product", "Cost", "Price", "Client", "Day" };
然後調用BindDLLs方法:
foreach (string filterName in filterArray)
{
// Find the ddl to populate
DropDownList ddl = (DropDownList)this.FindControl("ddl_" + filterName);
// Get the data for that ddl only (use filterName in the select...)
var query = (from items in results select items.filterName.ToString()).Distinct();
// Populate the ddl (not complete code...)
foreach (var item in query)
{
ddl.Items.Add(item...);
}
}
我的問題是我找到了很多關於如何在運行時修改WHERE或GROUP BY或linq語句的任何其他部分的文檔。我只是沒有找到任何關於如何動態更改我想要檢索的字段。
是否有捷徑可尋?謝謝。益脾
編輯:
List<Orders> results = OrdersService.GetOrders();
public class Orders
{
[DataMember]
public DateTime? Day
[DataMember]
public int? Order
[DataMember]
public int? Product
[DataMember]
public int? Cost
[DataMember]
public int? Price
[DataMember]
public int? Client
[DataMember]
}
var query = "....";
query = query.Select("PropName");
您可以通過手動構建lambda表達式來解決此問題。
您當前使用的查詢可以更改為使用方法鏈語法,然後如下所示:
var query = results.Select(item => item.<filterName>.ToString()).Distinct();
現在我們需要創建自己傳遞給Distinct
的lambda表達式。
這可以使用以下方法實現:
Expression<Func<YourResultType, string>> CreateExpression(string propertyName)
{
var itemExpression = Expression.Parameter(typeof(YourResultType), "item");
var propertyExpression = Expression.Property(itemExpression, propertyName);
var toStringExpression = Expression.Call(propertyExpression,
"ToString", null);
return Expression.Lambda<Func<YourResultType, string>>(toStringExpression,
itemExpression);
}
現在我們可以將查詢更改為:
var query = results.Select(CreateExpression(filterName)).Distinct();
請注意,您需要將YourResultType
更改為results
變量中實例的類型。此外,如果您不是查詢數據庫而是查詢內存列表,則需要將查詢更改為:
var query = results.Select(CreateExpression(filterName).Compile()).Distinct();