C# LINQ中的嵌套泛型lambda

C# LINQ中的嵌套泛型lambda,c#,.net,linq,lambda,expression-trees,C#,.net,Linq,Lambda,Expression Trees,我试图理解LINQ中的表达,这让我自己都快发疯了。任何帮助都是非常感谢的(甚至告诉我,我在这里完全不靠谱) 假设我有三节课 public class Person { public string Name { get; set;} public IEnumerable<PersonLocation> Locations { get; set;} public IEnumerable<PersonEducation> Educations { get

我试图理解LINQ中的表达,这让我自己都快发疯了。任何帮助都是非常感谢的(甚至告诉我,我在这里完全不靠谱)

假设我有三节课

public class Person
{
    public string Name { get; set;}
    public IEnumerable<PersonLocation> Locations { get; set;}
    public IEnumerable<PersonEducation> Educations { get; set:}
}

public class PersonLocation
{
    public string Name { get; set;}
    public string Floor { get; set;}
    public string Extension { get; set;}
}

public class PersonEducation
{
   public string SchoolName { get; set;}
   public string GraduationYear { get; set;}
}
以下是我一直在玩的IEnumerable类型,但我无法将内部的Any(似乎正确)连接到外部的位置:

/*i.e. modelPropertyParts[0] = Locations & modelPropertyParts[1] = Name */
string[] modelPropertyParts = ModelProperty.Split('.');

var interiorProperty = prop.PropertyType.GetGenericArguments()[0];
var interiorParameter = Expression.Parameter(interiorProperty, "personlocation");
var interiorField = Expression.PropertyOrField(interiorParameter, modelPropertyParts[1]);
var interiorExpression = Expression.Equal(interiorField, Expression.Constant(Value));
var innerLambda = Expression.Lambda<Func<PersonLocation, bool>>(interiorExpression, interiorParameter);

var outerParameter = Expression.Parameter(typeof(Person), "person");
var outerField = Expression.PropertyOrField(outerParameter, modelPropertyParts[0]);
var outerExpression = ??
var outerLambda == ??

return people.Where(outerLambda.Compile());
/*即modelPropertyParts[0]=位置和modelPropertyParts[1]=名称*/
字符串[]modelPropertyParts=ModelProperty.Split('.');
var interiorProperty=prop.PropertyType.GetGenericArguments()[0];
var interiorParameter=表达式.参数(interiorProperty,“personlocation”);
var interiorField=Expression.PropertyOrField(interiorParameter,modelPropertyParts[1]);
var interiorExpression=表达式.Equal(内部字段,表达式.常量(值));
var innerLambda=表达式.Lambda(内部表达式,内部参数);
var outerParameter=表达式.参数(typeof(Person),“Person”);
var outerField=Expression.PropertyOrField(outerParameter,modelPropertyParts[0]);
var outerExpression=??
变量outerLambda==??
返回people.Where(outerLambda.Compile());

问题在于
System.Linq.Enumerable.Any
是一种静态扩展方法

您的
outerExpression
必须引用
System.Linq.Enumerable.Any(IEnumerable,Func)

有关更多信息,请查看以下链接:


太棒了,谢谢!这基本上是可行的,唯一的问题是您传入的类型不正确。它应该是内部财产,而不是类型的(人)哦,是的,我现在明白了。请随意更正答案(社区维基)
string[] modelPropertyParts = ModelProperty.Split('.');
var prop = typeof(Person).GetProperty(modelPropertyParts[0]);
var sourceParam = Expression.Parameter(typeof(Person), "person");
var expression = Expression.Equal(Expression.PropertyOrField(sourceParam, modelPropertyParts[0]), Expression.Constant(option.Name));
var whereSelector = Expression.Lambda<Func<Person, bool>>(orExp, sourceParam);
return people.Where(whereSelector.Compile());
/*i.e. modelPropertyParts[0] = Locations & modelPropertyParts[1] = Name */
string[] modelPropertyParts = ModelProperty.Split('.');

var interiorProperty = prop.PropertyType.GetGenericArguments()[0];
var interiorParameter = Expression.Parameter(interiorProperty, "personlocation");
var interiorField = Expression.PropertyOrField(interiorParameter, modelPropertyParts[1]);
var interiorExpression = Expression.Equal(interiorField, Expression.Constant(Value));
var innerLambda = Expression.Lambda<Func<PersonLocation, bool>>(interiorExpression, interiorParameter);

var outerParameter = Expression.Parameter(typeof(Person), "person");
var outerField = Expression.PropertyOrField(outerParameter, modelPropertyParts[0]);
var outerExpression = ??
var outerLambda == ??

return people.Where(outerLambda.Compile());
var outerExpression = Expression.Call(
    typeof(System.Linq.Enumerable), 
    "Any", 
    new Type[] { outerField.Type, innerLambda.Type }, 
    outerField, innerLambda);