[英]C# Linq - Create a dynamic select query based on user input
用例:用戶需要能夠對 select 的輸入字段進行審核。 然后該字段請求通過查詢傳遞,然后返回用戶輸入的列表以供查看。 基本上,SQL 中的動態 Select 語句,其中 FROM 列是用戶定義的變量。
方法:使用 C# 和 Linq 我編寫了以下 Linq 查詢以返回數據,但是,我無法將查詢中的實際字段名稱與用戶設置的變量交換。
研究:我已經回顧了十幾個類似的問題和文章,它們似乎都比我試圖完成的要復雜得多,而且它們似乎沒有完全回答我的問題; 那或者我只是不了解解決方案實際上是什么。 我試過玩 Dynamic Linq ,但運氣不佳,使用表達式樹似乎比我希望的實際需要復雜得多。
顯式定義字段 Select:
var Values = conn.Table<DataTable>()
.Where(t => t.User_ID == ID)
.Select(t => FieldName).Distinct().ToList();
可變字段 Select
//allowing the user to set the value
string UserSelectedField = y_List[0].ToString();
var Values = conn.Table<DataTable>()
.Where(t => t.User_ID == ID)
.Select(t => @UserSelectedField).Distinct().ToList();
在第一個查詢中,我得到了我正在尋找的結果,但它只能從代碼中鍵入的字段返回值。
第二個返回 object 名稱,如 {FieldName = FieldName}。
我也試過在查詢中連接它,但這沒有用。 認為它不會,但值得一試。
您必須在此處編寫自己的擴展名和限制,您必須知道字段的類型:
public static class MyExtensions
{
public class DynamicHelper<T>
{
private IQueryable<T> _query;
internal DynamicHelper(IQueryable<T> query)
{
_query = query;
}
public IQueryable<TResult> SelectByFieldName<TResult>(string fieldName)
{
return MyExtensions.SelectByFieldName<T, TResult>(_query, fieldName);
}
}
public static DynamicHelper<T> Dynamic<T>(this IQueryable<T> query)
{
return new DynamicHelper<T>(query);
}
private static IQueryable<TResult> SelectByFieldName<T, TResult>(IQueryable<T> query, string fieldName)
{
var param = Expression.Parameter(typeof(T), "e");
Expression body = Expression.PropertyOrField(param, fieldName);
if (body.Type != typeof(TResult))
body = Expression.Convert(body, typeof(TResult));
var lambda = Expression.Lambda<Func<T, TResult>>(body, param);
return query.Select(lambda);
}
}
和用法
string UserSelectedField = y_List[0].ToString();
var Values = conn.Table<DataTable>()
.Where(t => t.User_ID == ID)
.Dynamic().SelectByFieldName<string>(UserSelectedField)
.Distinct()
.ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.