C# 为具有两个参数的lambda声明提供的参数数量不正确

C# 为具有两个参数的lambda声明提供的参数数量不正确,c#,extension-methods,C#,Extension Methods,我有疑问 return this._articlesRepository.GetEntities() .Join(this._categoryRepository.GetEntities(), article => article.CategoryId, cat => cat.Id, (article, cat) => new {article, CategoryName = cat.Tit

我有疑问

return this._articlesRepository.GetEntities()
            .Join(this._categoryRepository.GetEntities(),
                article => article.CategoryId,
                cat => cat.Id, (article, cat) => new {article, CategoryName = cat.Title}).Select(new T());
我有select的可查询扩展名。我尝试为动态生成的select查询创建扩展

public static IQueryable<TResult> Select<TSource, TResult>(this IQueryable<TSource> source, TResult result)
    {
        var resultType = typeof(TResult);
        var resultObj = Expression.New(resultType);
        var receiverProperties = resultType.GetProperties();
        Type type = typeof(TSource);
        ParameterExpression sourceParameter = Expression.Parameter(type, "item");
        ParameterExpression anyParameter = null;
        var resultParameters = new List<MemberBinding>();

        foreach (var receiverProperty in receiverProperties)
        {
            var sourceProperty = typeof(TSource).GetProperty(receiverProperty.Name);

            if (sourceProperty != null)
            {
                var sourcePropertyAccess = Expression.MakeMemberAccess(sourceParameter, sourceProperty);
                var memberInit = Expression.Bind(receiverProperty, sourcePropertyAccess);
                resultParameters.Add(memberInit);
            }
        }

        if (typeof(TSource).Name.Contains("AnonymousType"))
        {
            foreach (var property in typeof(TSource).GetProperties())
            {
                if (property.PropertyType.BaseType == typeof(BaseEntity))
                {
                    anyParameter = Expression.Parameter(property.PropertyType, "item."+property.Name);

                    foreach (var receiverProperty in receiverProperties)
                    {
                        var sourceProperty = property.PropertyType.GetProperty(receiverProperty.Name);

                        if (sourceProperty != null)
                        {
                            var sourcePropertyAccess = Expression.MakeMemberAccess(anyParameter, sourceProperty);
                            var memberInit = Expression.Bind(receiverProperty, sourcePropertyAccess);
                            resultParameters.Add(memberInit);
                        }
                    }
                }
            }
        }

        if (anyParameter != null)
        {
            var selector = Expression.Lambda<Func<TSource, TResult>>(Expression.MemberInit(resultObj, resultParameters), sourceParameter, anyParameter);
            var method = Expression.Call(typeof(Queryable), "Select", new[] { source.ElementType, selector.Body.Type }, source.Expression, Expression.Quote(selector));
            return source.Provider.CreateQuery<TResult>(method);
        }
        else
        {
            var selector = Expression.Lambda<Func<TSource, TResult>>(Expression.MemberInit(resultObj, resultParameters), sourceParameter);
            var method = Expression.Call(typeof(Queryable), "Select", new[] { source.ElementType, selector.Body.Type }, source.Expression, Expression.Quote(selector));
            return source.Provider.CreateQuery<TResult>(method);
        }
    }
publicstaticiQueryable选择(此IQueryable源,TResult结果)
{
var resultType=typeof(TResult);
var resultObj=Expression.New(resultType);
var receiverProperties=resultType.GetProperties();
类型类型=类型(t源);
ParameterExpression sourceParameter=Expression.Parameter(类型“item”);
ParameterExpression anyParameter=null;
var resultParameters=新列表();
foreach(receiverProperties中的var receiverProperty)
{
var sourceProperty=typeof(TSource).GetProperty(receiverProperty.Name);
if(sourceProperty!=null)
{
var sourcePropertyAccess=Expression.MakeMemberAccess(sourceParameter,sourceProperty);
var memberInit=Expression.Bind(receiverProperty,sourcePropertyAccess);
resultParameters.Add(memberInit);
}
}
if(typeof(TSource).Name.Contains(“匿名类型”))
{
foreach(typeof(TSource).GetProperties()中的var属性)
{
if(property.PropertyType.BaseType==typeof(BaseEntity))
{
anyParameter=Expression.Parameter(property.PropertyType,“item.”+property.Name);
foreach(receiverProperties中的var receiverProperty)
{
var sourceProperty=property.PropertyType.GetProperty(receiverProperty.Name);
if(sourceProperty!=null)
{
var sourcePropertyAccess=Expression.MakeMemberAccess(anyParameter,sourceProperty);
var memberInit=Expression.Bind(receiverProperty,sourcePropertyAccess);
resultParameters.Add(memberInit);
}
}
}
}
}
if(anyParameter!=null)
{
var选择器=Expression.Lambda(Expression.MemberInit(resultObj,resultParameters),sourceParameter,anyParameter);
var方法=Expression.Call(typeof(Queryable),“Select”,new[]{source.ElementType,selector.Body.Type},source.Expression,Expression.Quote(selector));
返回source.Provider.CreateQuery(方法);
}
其他的
{
var选择器=Expression.Lambda(Expression.MemberInit(resultObj,resultParameters),sourceParameter);
var方法=Expression.Call(typeof(Queryable),“Select”,new[]{source.ElementType,selector.Body.Type},source.Expression,Expression.Quote(selector));
返回source.Provider.CreateQuery(方法);
}
}
但我的密码在这一刻掉了

var selector 
   = Expression.Lambda<Func<TSource, TResult>>
       (Expression.MemberInit(resultObj, resultParameters),
        sourceParameter, 
        anyParameter);
var选择器
=表达式Lambda
(Expression.MemberInit(resultObj,resultParameters),
sourceParameter,
任何参数);
我不明白为什么?我知道我的代码看起来很糟糕。但后来我解决了这个问题

我的旧代码运行良好

 public static IQueryable<TResult> Select<TSource, TResult>(this IQueryable<TSource> source, TResult result)
    {
        var resultType = typeof(TResult);
        var resultObj = Expression.New(resultType);
        var receiverProperties = resultType.GetProperties();
        Type type = typeof(TSource);
        ParameterExpression sourceParameter = Expression.Parameter(type, "item");
        var resultParameters = new List<MemberBinding>();

        foreach (var receiverProperty in receiverProperties)
        {
            var sourceProperty = typeof(TSource).GetProperty(receiverProperty.Name);

            if (sourceProperty != null)
            {
                var sourcePropertyAccess = Expression.MakeMemberAccess(sourceParameter, sourceProperty);
                var memberInit = Expression.Bind(receiverProperty, sourcePropertyAccess);
                resultParameters.Add(memberInit);
            }
        }
            var selector = Expression.Lambda<Func<TSource, TResult>>(Expression.MemberInit(resultObj, resultParameters), sourceParameter);
            var method = Expression.Call(typeof(Queryable), "Select", new[] { source.ElementType, selector.Body.Type }, source.Expression, Expression.Quote(selector));
            return source.Provider.CreateQuery<TResult>(method);
    }
publicstaticiQueryable选择(此IQueryable源,TResult结果)
{
var resultType=typeof(TResult);
var resultObj=Expression.New(resultType);
var receiverProperties=resultType.GetProperties();
类型类型=类型(t源);
ParameterExpression sourceParameter=Expression.Parameter(类型“item”);
var resultParameters=新列表();
foreach(receiverProperties中的var receiverProperty)
{
var sourceProperty=typeof(TSource).GetProperty(receiverProperty.Name);
if(sourceProperty!=null)
{
var sourcePropertyAccess=Expression.MakeMemberAccess(sourceParameter,sourceProperty);
var memberInit=Expression.Bind(receiverProperty,sourcePropertyAccess);
resultParameters.Add(memberInit);
}
}
var选择器=Expression.Lambda(Expression.MemberInit(resultObj,resultParameters),sourceParameter);
var方法=Expression.Call(typeof(Queryable),“Select”,new[]{source.ElementType,selector.Body.Type},source.Expression,Expression.Quote(selector));
返回source.Provider.CreateQuery(方法);
}

分配给var选择器时会发生什么?包含有关特定故障的信息总是好的。AnyParameters不是数组,resultParameters是数组这一事实与问题有关吗?DWright resultParameters它的数组映射、sourceParameter和anyParameter它的主体项和项。article