Linq表达式-参数无效
本文关键字:无效 参数 表达式 Linq | 更新日期: 2023-09-27 17:58:25
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
}
由于某种原因,Expression>要求我使用3个参数,过去我只对有问题的实例使用了2个参数。然而,现在我想在这个实例中的一个集合上进行查找。
我得到以下错误:
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>>'
期望结果:能够在类EcImageWrapper 的实例中使用返回类型为EcFieldWrapper的谓词和谓词类型为EcFieldWrapper
为什么它需要3?为什么是int?
现有方法不需要3个参数,它需要一个Expression<Func<EcFieldWrapper, int, bool>>
,因为这是您声明要接受的方法。这将类似于:
// This version ignores the index, but you could use it if you wanted to.
(value, index) => value.Name.ToUpper() == fieldName.ToUpper()
index
将是集合中的位置,因为您正在调用Queryable.Where
的重载。
假设您不想要索引,我强烈怀疑您只是想将FindBy
方法更改为:
public EcFieldWrapper FindBy(Expression<Func<EcFieldWrapper, bool>> predicate)
{
return this.ListOfFields.Where(predicate).SingleOrDefault();
}
或者更简单地说,使用接受谓词的SingleOrDefault
的重载:
public EcFieldWrapper FindBy(Expression<Func<EcFieldWrapper, bool>> predicate)
{
return this.ListOfFields.SingleOrDefault(predicate);
}
这应该很好用,如果不行,你应该告诉我们当你尝试它时会发生什么。
不需要Find
方法。在FindByName
中执行所有操作。
public EcFieldWrapper FindByName(string fieldName)
{
fieldName = fieldName.ToUpper();
return ListOfFields
.SingleOrDefeault(x => x.Name.ToUpper() == fieldName);
}