Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 每个属性的GroupBy Lamda表达式生成器_C#_Linq_Expression - Fatal编程技术网

C# 每个属性的GroupBy Lamda表达式生成器

C# 每个属性的GroupBy Lamda表达式生成器,c#,linq,expression,C#,Linq,Expression,我想用列表中的项目填充组合框的itemsource,具体取决于选择了T中的哪个属性 声明应该是这样的: foreach属性是字符串, 选择属性的值,使其不同 public Dictionary<string, List<string>> CreateSuggestionsLists<T>(List<T> data) { var queryableData = data.AsQueryable(); v

我想用列表中的项目填充组合框的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;
    }
public Dictionary createSuggestionsList(列表数据)
{
var queryableData=data.AsQueryable();
var paramExp=表达式参数(typeof(T),“left”);
foreach(typeof(T).GetProperties()中的var pi,其中(p=>p.PropertyType==typeof(string)))
{
var callExpr=Expression.MakeMemberAccess(paramExp,pi);
var lambdaExpr=Expression.Lambda(调用方xpr);
//从现在开始它就出问题了!!!
var comleexpr=lambdaExpr作为表达式;
var compiledExpr=comleeexpr.Compile();
var res=data.Select(compiledExpr.Distinct().ToList();
//添加到结果。。。
}
返回null;
}
问题似乎在于如何从lambda表达式中进行转换以准备编译


谢谢您的帮助。

我想您应该检查一下施法结果是否为空:

          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;
    }
public Dictionary createSuggestionsList(列表数据)
{
IQueryable queryableData=data.AsQueryable();
ParameterExpression parameterxp=Expression.Parameter(typeof(T),“left”);
foreach(typeof(T).GetProperties()中的PropertyInfo pi,其中(p=>p.PropertyType==typeof(string)))
{
MemberExpression callExpr=Expression.MakeMemberAccess(参数xp,pi);
LambdaExpression lambdaExpr=Expression.Lambda(调用方xpr);
//从现在开始它就出问题了!!!
如果(!(lambdaExpr是表达式comletexpr))继续;
Func compiledExpr=comleeexpr.Compile();
List res=data.Select(compiledExpr.Distinct().ToList();
//添加到结果。。。
}
返回null;
}

首先,您需要向lambda提供
参数xp
。其次,还有一种更易于使用的
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;
    }
public Dictionary createSuggestionsList(列表数据)
{
var queryableData=data.AsQueryable();
var paramExp=表达式参数(typeof(T),“left”);
foreach(typeof(T).GetProperties()中的var pi,其中(p=>p.PropertyType==typeof(string)))
{
var callExpr=Expression.MakeMemberAccess(paramExp,pi);
var lambdaExpr=Expression.Lambda(调用方xpr,参数xp);
var res=queryableData.Select(lambdaExpr.Distinct().ToList();
//添加到结果。。。
}
返回null;
}

Hi Shehab,谢谢你的建议。不幸的是,所有属性的强制转换都为空。lambdaexpression是{()=>f.X},但是强制转换总是空的。好的,让我们重新开始。您能澄清一下您对这个方法的期望吗?因为lambdaExpr是表达式而不是强制转换,您应该使用
Expression.Lambda(callExpr,paramExp)