C# 如何获取返回表达式的方法以解决“epress中无法识别的方法调用”错误?
我有以下语句抛出了一个我不理解的错误:C# 如何获取返回表达式的方法以解决“epress中无法识别的方法调用”错误?,c#,nhibernate,lambda,C#,Nhibernate,Lambda,我有以下语句抛出了一个我不理解的错误: return (int) _session.CreateCriteria<T>() .Add(LambdaSubquery.Property<Fund>(x => x.Id) .In(GetAvailableIdsPerDataUniverse(x => x.GetDataUniverseId()))) .AddNameSearchCriteria<T>(searchExpre
return (int) _session.CreateCriteria<T>()
.Add(LambdaSubquery.Property<Fund>(x => x.Id)
.In(GetAvailableIdsPerDataUniverse(x => x.GetDataUniverseId())))
.AddNameSearchCriteria<T>(searchExpression)
.SetProjection(LambdaProjection.Count<T>(e => e.Id))
.UniqueResult();
并且x=>x.GetDataUniverseId在我的Fund类中定义为
如果不是尝试将x=>x.GetDataUniverseId作为参数传递,而是使用“硬编码”f=>f.Id或f=>f.Company.Id,则此方法有效。我希望正在处理的类型能够提供所需的表达式,而不是将该表达式传递到使用GetAvailableIdsPerDataUniverse的每个方法中。我认为它可以执行返回表达式的方法,而不是访问推断类型的属性
问题:
我能做些什么来解决这个错误吗
注:
一切都很好,所以当我运行它时,我有点惊讶地看到它抛出了一个错误。主要原因是,当我将表达式作为参数传入时,我对其进行了“硬编码”,结果很好
此外,我还尝试了以下操作,但没有成功,因为我指定了希望GetAvailableIdsPerDataUniverse操作的类型:
.In(GetAvailableIdsPerDataUniverse<Fund>(x => x.GetDataUniverseId())))
尝试:
我被告知这里的问题是我想要多态静态方法的行为,但我不能这样做,因为GetDataUniverseId不是一个实例方法,我需要一个实例来多态地使用它 这个解决方案虽然效率低下,因为它使用了大量的反射,但是它使用了新的T 以致
.Add(LambdaSubquery.Property<Fund>(x => x.Id)
.In(GetAvailableIdsPerDataUniverse(x => x.GetDataUniverseId())))
变成
.Add(LambdaSubquery.Property<Fund>(x => x.Id)
.In(GetAvailableIdsPerDataUniverse((new T()).GetDataUniverseId())))
唯一的另一个问题是,该方法存在于:
public IEnumerable<T> GetEntitiesByName<T>(int pageSize, string searchExpression)
where T : class, ISearchableEntity
现在必须具有新约束,如下所示:
public IEnumerable<T> GetEntitiesByName<T>(int pageSize, string searchExpression)
where T : class, ISearchableEntity, new()
我希望有人能从中找到比@Sunny提供的“答案”更有用的东西,恕我直言,DaveDev,我的印象是,我们得到了错误,因为“x”在之前的lamba中已经定义了&所以我的“答案”…如果是这样的话,就足够公平了。但我相信你能理解我的沮丧。如果这是你的真实意图,你应该用解释更新你的答案。大家好,我知道这个问题已经很老了,但你们现在能不能重现这个错误,以便再次检查epress的拼写?因为两年后,Ehsan报告了nhibernate中的一个类似错误,其中有一个表达式的拼写错误,如果拼写在2010年到2012年间确实有所改善,那么最好更新问题以匹配实际的拼写错误。
.Add(LambdaSubquery.Property<Fund>(x => x.Id)
.In(GetAvailableIdsPerDataUniverse(x => x.GetDataUniverseId())))
.Add(LambdaSubquery.Property<Fund>(x => x.Id)
.In(GetAvailableIdsPerDataUniverse((new T()).GetDataUniverseId())))
public IEnumerable<T> GetEntitiesByName<T>(int pageSize, string searchExpression)
where T : class, ISearchableEntity
public IEnumerable<T> GetEntitiesByName<T>(int pageSize, string searchExpression)
where T : class, ISearchableEntity, new()