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