簡體   English   中英

每個屬性的GroupBy Lamda表達式生成器

[英]Expression builder for GroupBy Lamda for each property

我想用列表中的項目填充ComboBox的itemsource,具體取決於從T中選擇了哪個屬性。

該語句應類似於:foreach屬性(它是一個字符串),選擇屬性的值,使其與眾不同。

    public Dictionary<string, List<string>> CreateSuggestionsLists<T>(List<T> data)
    {
        var queryableData = data.AsQueryable();
        var paramExp = Expression.Parameter(typeof(T), "left");
        foreach (var pi in typeof(T).GetProperties().Where(p => p.PropertyType == typeof(string)))
        {
            var callExpr = Expression.MakeMemberAccess(paramExp, pi);
            var lambdaExpr = Expression.Lambda(callExpr) ;
            // From here on it goes wrong!!!
            var comleteExpr = lambdaExpr as Expression<Func<T, bool>>;
            var compiledExpr = comleteExpr.Compile();

            var res = data.Select(compiledExpr).Distinct().ToList();
            // add to results ...
        }

        return null;
    }

問題似乎是從lambda表達式進行轉換以准備進行編譯。

謝謝您的幫助。

首先,您需要為lambda提供paramExp 其次,有通用版本的Lamda方法,它更易於使用。 最后,使用IQueryable時不需要編譯表達式。 您創建了queryableData變量,但沒有使用它。

這是代碼:

    public Dictionary<string, List<string>> CreateSuggestionsLists<T>(List<T> data)
    {
        var queryableData = data.AsQueryable();
        var paramExp = Expression.Parameter(typeof(T), "left");
        foreach (var pi in typeof(T).GetProperties().Where(p => p.PropertyType == typeof(string)))
        {
            var callExpr = Expression.MakeMemberAccess(paramExp, pi);
            var lambdaExpr = Expression.Lambda<Func<T, bool>>(callExpr, paramExp);

            var res = queryableData.Select(lambdaExpr).Distinct().ToList();
            // add to results ...
        }

        return null;
    }

我認為您應該檢查轉換結果是否不為null:

          public Dictionary<string, List<string>> CreateSuggestionsLists<T>(List<T> data)
    {
        IQueryable<T> queryableData = data.AsQueryable();
        ParameterExpression paramExp = Expression.Parameter(typeof(T), "left");

        foreach (PropertyInfo pi in typeof(T).GetProperties().Where(p => p.PropertyType == typeof(string)))
        {
            MemberExpression callExpr = Expression.MakeMemberAccess(paramExp, pi);
            LambdaExpression lambdaExpr = Expression.Lambda(callExpr);
            // From here on it goes wrong!!!
            if (!(lambdaExpr is Expression<Func<T, bool>> comleteExpr)) continue;

            Func<T, bool> compiledExpr =  comleteExpr.Compile();

            List<bool> res = data.Select(compiledExpr).Distinct().ToList();

            // add to results ...
        }

        return null;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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