У меня есть следующее утверждение, которое выдает ошибку, которую я не понимаю:
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.GetDataUniverseId ()
Фон:
У меня есть несколько разных типов, которые мне нужны для поиска. Каждый из этих типов реализует ISearchable
, который требует, чтобы они имели свойства Name
& Id
, а также метод GetDataUniverseId()
, который будет возвращать выражение, представляющее dataUniverseId, необходимый для LambdaProjection
.
Метод GetAvailableIdsPerDataUniverse(x => x.GetDataUniverseId())
имеет следующую подпись:
protected DetachedCriteria
GetAvailableIdsPerDataUniverse(System.Linq.Expressions.Expression<Func<Fund, object>> dataUniverseId)
и x => x.GetDataUniverseId()
определены в моем Fund
классе как
public virtual System.Linq.Expressions.Expression<Func<Fund, object>> GetDataUniverseId()
{
return f => f.Id;
}
и, например, в классе Company
:
public virtual Expression<Func<Fund, object>> GetDataUniverseId()
{
return f => f.Company.Id;
}
Это работает, если вместо попытки передать x => x.GetDataUniverseId()
в качестве параметра, я 'hard-code' f => f.Id
или f => f.Company.Id
. Мне бы хотелось, чтобы тип, над которым работали, мог предоставить нужное ему выражение, а не передавать это выражение в каждый метод, использующий GetAvailableIdsPerDataUniverse()
. Я подумал, что вместо доступа к свойству выведенного типа, он может выполнить метод, который будет возвращать выражение.
Вопрос:
Что я могу сделать, чтобы устранить эту ошибку?
Примечание:
Все прекрасно работает, поэтому я был немного удивлен, увидев, что он выдал ошибку при запуске. Главным образом потому, что когда я передавал выражение как параметр, который я «жестко запрограммировал», оно работало нормально.
Кроме того, я также попробовал следующее безрезультатно, где я указываю тип, с которым я хочу GetAvailableIdsPerDataUniverse
действовать:
.In(GetAvailableIdsPerDataUniverse<Fund>(x => x.GetDataUniverseId())))