C# 每个属性的GroupBy Lamda表达式生成器
我想用列表中的项目填充组合框的itemsource,具体取决于选择了T中的哪个属性 声明应该是这样的: foreach属性是字符串, 选择属性的值,使其不同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
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)