我有这个方法:
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();
}
}
答案 0 :(得分:1)
答案 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);
}