C# Linq表达式-无效参数 公共类EcImageWrapper { //等等。。。 公共可查询列表字段 { 得到 { //这里的逻辑 返回此.listOfFields.AsQueryable(); } } 公共EcFieldWrapper FindBy(表达式谓词) { 返回此.ListOfFields.Where(谓词).SingleOrDefault(); } 公共EcFieldWrapper FindByName(字符串字段名) { 返回这个.FindBy(x=>x.Name.ToUpper()==fieldName.ToUpper()); //此处出错,需要3个参数 //这是有意义的,因为上面的表达式有3 //但我不知道该怎么解决这个问题 }

C# Linq表达式-无效参数 公共类EcImageWrapper { //等等。。。 公共可查询列表字段 { 得到 { //这里的逻辑 返回此.listOfFields.AsQueryable(); } } 公共EcFieldWrapper FindBy(表达式谓词) { 返回此.ListOfFields.Where(谓词).SingleOrDefault(); } 公共EcFieldWrapper FindByName(字符串字段名) { 返回这个.FindBy(x=>x.Name.ToUpper()==fieldName.ToUpper()); //此处出错,需要3个参数 //这是有意义的,因为上面的表达式有3 //但我不知道该怎么解决这个问题 },c#,linq,lambda,func,linq-expressions,C#,Linq,Lambda,Func,Linq Expressions,出于某种原因,表达式>要求我使用3个参数,在过去,我只对所讨论的实例使用了2个参数。但是,现在我想对该实例中的集合执行“查找依据” 我得到以下错误: public class EcImageWrapper { //etc... public IQueryable<EcFieldWrapper> ListOfFields { get { //logic here return

出于某种原因,表达式>要求我使用3个参数,在过去,我只对所讨论的实例使用了2个参数。但是,现在我想对该实例中的集合执行“查找依据”

我得到以下错误:

public class EcImageWrapper
{

    //etc...

    public IQueryable<EcFieldWrapper> ListOfFields
    {
        get
        {
            //logic here

            return this.listOfFields.AsQueryable();
        }
    }

    public EcFieldWrapper FindBy(Expression<Func<EcFieldWrapper, int, bool>> predicate)
    {
        return this.ListOfFields.Where(predicate).SingleOrDefault();
    }

    public EcFieldWrapper FindByName(string fieldName)
    {
        return this.FindBy(x => x.Name.ToUpper() == fieldName.ToUpper());
        //error here, wanting 3 arguments
        //which makes sense as the above Expression has 3
        //but i don't know how to get around this
    }
委托“System.Func”不接受1个参数
与“CaptureUE.Wrappers.EcImageWrapper.FindBy(System.Linq.Expressions.Expression)”匹配的最佳重载方法具有一些无效参数
参数1:无法从“字符串”转换为“System.Linq.Expressions.Expression”
预期结果: 能够在类EcImageWrapper的实例中使用返回类型EcFieldWrapper的谓词和EcFieldWrapper的谓词类型


为什么它需要3个?为什么是int?

现有方法不需要3个参数-它需要一个
表达式,因为这是您声明要接受的方法。这类似于:

Delegate 'System.Func<MSDORCaptureUE.Wrappers.EcFieldWrapper,int,bool>' does not take 1 arguments
The best overloaded method match for 'CaptureUE.Wrappers.EcImageWrapper.FindBy(System.Linq.Expressions.Expression<System.Func<CaptureUE.Wrappers.EcFieldWrapper,int,bool>>)' has some invalid arguments
Argument 1: cannot convert from 'string' to 'System.Linq.Expressions.Expression<System.Func<CaptureUE.Wrappers.EcFieldWrapper,int,bool>>'
索引将是集合中的位置,正如您调用的
Queryable.Where

假设您不需要索引,我强烈怀疑您只是想将
FindBy
方法更改为:

// This version ignores the index, but you could use it if you wanted to.
(value, index) => value.Name.ToUpper() == fieldName.ToUpper()

这应该可以很好地工作-如果不行,您应该告诉我们在尝试时会发生什么。

现有方法不需要3个参数-它需要一个
表达式,因为这是您声明要接受的方法。这类似于:

Delegate 'System.Func<MSDORCaptureUE.Wrappers.EcFieldWrapper,int,bool>' does not take 1 arguments
The best overloaded method match for 'CaptureUE.Wrappers.EcImageWrapper.FindBy(System.Linq.Expressions.Expression<System.Func<CaptureUE.Wrappers.EcFieldWrapper,int,bool>>)' has some invalid arguments
Argument 1: cannot convert from 'string' to 'System.Linq.Expressions.Expression<System.Func<CaptureUE.Wrappers.EcFieldWrapper,int,bool>>'
索引将是集合中的位置,正如您调用的
Queryable.Where

假设您不需要索引,我强烈怀疑您只是想将
FindBy
方法更改为:

// This version ignores the index, but you could use it if you wanted to.
(value, index) => value.Name.ToUpper() == fieldName.ToUpper()

这应该可以很好地工作——如果不行,您应该告诉我们尝试时会发生什么。

不需要
Find
方法。在
FindByName
中执行所有操作

public EcFieldWrapper FindBy(Expression<Func<EcFieldWrapper, bool>> predicate)
{
    return this.ListOfFields.SingleOrDefault(predicate);
}

不需要
Find
方法。在
FindByName
中执行所有操作

public EcFieldWrapper FindBy(Expression<Func<EcFieldWrapper, bool>> predicate)
{
    return this.ListOfFields.SingleOrDefault(predicate);
}

“表达式要求我使用三个参数”的确切含义是什么?如果您将方法更改为仅使用
表达式会发生什么情况?Hrm…我可以发誓,在我之前这样做时,它抛出了一个错误。现在我尝试它时,它似乎没有抛出错误。您的确切含义是什么“表达式要求我使用三个参数“?如果您将方法更改为一个
表达式,会发生什么情况?
?Hrm…我可以发誓,在我之前这样做时,它抛出了一个错误。现在我尝试它时,它似乎没有抛出一个错误。谢谢…我将尝试一下,完成后接受您的答案。与.Where(predicate).SingleOrDefault()有什么区别?”和.SingleOrDefault(谓词)?性能有提高吗?它如何以不同的方式处理每个调用?@bizah:我希望它们转换为相同的SQL,因此不会有性能差异。谢谢……我会尝试一下,完成后接受您的答案。.Where(谓词)。SingleOrDefault()和.SingleOrDefault()的区别是什么(谓语)?性能是否有所提高?它如何以不同的方式处理每个调用?@bizah:我希望它们转换为相同的SQL,因此没有性能差异。FindByName最初是以这种方式完成的。然而,这是我测试类本地的一种方式,我更希望使用FindBy,它对所有谓词都是动态的,而不是动态的只支持name属性。FindByName最初是这样做的。然而,这是我测试类本地的一种方法,我更喜欢使用FindBy,它对所有谓词都是动态的,而不是只支持name属性。