Выражение и параметр - PullRequest
0 голосов
/ 09 июля 2010

У меня есть этот метод:

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();
    }
}

Ответы [ 3 ]

1 голос
/ 12 июля 2010

Это звучит как проблема, когда LinqKit может быть решением, которое вы ищете:

http://www.albahari.com/nutshell/linqkit.aspx

Посмотрите на это и посмотрите, решит ли оно это:)

0 голосов
/ 09 июля 2010

У меня нет компиляции, чтобы проверить это, но из кода IL, кажется, создается замыкание для someId. По сути, это создает func / expression, которое будет скомпилировано и выполнено позже, и компиляция предполагает, что вам понадобится значение someId во время его запуска, а не во время создания выражения. Я думаю, что если вы передадите его через временную программу, это должно сработать.

public static Expression<Func<MyEntity, bool>> MyMethod(string someId) 
{ 
    string tempSomeId = someId;
    return o => o.SomeProperty.Equals(tempSomeId); 
} 
0 голосов
/ 09 июля 2010

Вы уверены, что данное значение не равно нулю? Можете ли вы дать исключение, которое он бросает? Может быть, это int, который вам нужно передать как ID?

...