簡體   English   中英

C# Linq - 根據用戶輸入創建動態 select 查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM