У меня есть этот метод:
public static Expression<Func<MyEntity, bool>> MyMethod(string someId)
{
return o => o.SomeProperty.Equals(someId);
}
Этот метод передается другому методу, который использует структуру сущностей с этим выражением для получения соответствующих элементов.Моя проблема в том, что это не работает.Если я заменю someId как часть вызова Equals на фактическое значение, оно будет работать.Однако это не сработает, если я передам то же значение в этот метод выше.
Означает ли это, что параметр someId не будет оценен, пока выражение не будет фактически использовано, и, следовательно, не содержит фактического значения?Извините, я немного запутался здесь.
Спасибо
Обновление:
Некоторая отладочная информация для той, которая работает, когда параметр жестко закодирован
.Lambda #Lambda1<System.Func`2[MyEntity,System.Boolean]>(MyEntity $t) {\r\n .Call ($t.SomeProperty).Equals(\"test1\")
Некоторая отладочная информация для той, которая НЕ работает, когда значение передается в метод
.Lambda #Lambda1<System.Func`2[MyEntity,System.Boolean]>(MyEntity $t) {\r\n .Call ($t.SomeProperty).Equals(.Constant<MyEntity+<>c__DisplayClass4>(MyEntity+<>c__DisplayClass4).someId)
Я предполагаю, что когда значение не жестко закодировано, выражение получилоссылка на то, чего не существует?Извините, я в замешательстве с тем, что здесь происходит!
Обновление 2:
Вот где он используется - метод в классе репозитория:
public MyEntity Get(string someId)
{
var queryPredicate = MyEntity.MyMethod(someId);
var foundEntity = this.Query(queryPredicate);
}
Запрос - это метод в базовом классе хранилища, как показано ниже:
public IEnumerable<TEntity> Query(Expression<Func<TEntity, bool>> predicate)
{
if (predicate == null)
{
throw new ArgumentNullException("predicate");
}
using (var context = new TContext())
{
return context.CreateObjectSet<TEntity>().AsExpandable().Where(predicate).ToList();
}
}