表达和参数

时间:2010-07-09 15:03:02

标签: .net linq entity-framework entity

我有这个方法:

public static Expression<Func<MyEntity, bool>> MyMethod(string someId)
    {
        return o => o.SomeProperty.Equals(someId);
    }

这是传递给另一个方法,该方法使用带有此表达式的实体框架来检索匹配项。我的问题是它不起作用。如果我将someId作为Equals调用的一部分替换为实际值,它就可以工作。但是,如果我将相同的值传递给上面的方法,它就不起作用。

这是否意味着在实际使用表达式之前不会对someId参数进行求值,因此不包含实际值?对不起,这里有点困惑。

由于

更新

一些调试信息,用于在param是硬编码的情况下工作的那个

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

Query是存储库基类的一个方法,如下所示:

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 个答案:

答案 0 :(得分:1)

这听起来像LinqKit可以成为您正在寻找的解决方案的问题:

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

看看它,看它是否能解决它:)

答案 1 :(得分:0)

您确定给定的值不为空吗? 你能举出它抛出的例外吗? 也许这是一个“int”,你需要作为ID传递?

答案 2 :(得分:0)

我没有编译hnady来测试它,但是从IL代码来看,似乎是为someId创建了一个闭包。基本上,它正在创建一个将被编译的函数/表达式。稍后执行,编译假定您在运行时需要someId的值,而不是在创建表达式时。我想如果你把它传递给一个临时工,它应该可以工作。

public static Expression<Func<MyEntity, bool>> MyMethod(string someId) 
{ 
    string tempSomeId = someId;
    return o => o.SomeProperty.Equals(tempSomeId); 
}