2010-07-09 36 views
0

我有这样的方法:表达和参数

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

你能显示你想要使用这个结果的代码? – 2010-07-09 16:53:30

回答

1

这听起来像一个问题,即LinqKit可以是你正在寻找的解决方案:

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

看一看它,看看它是否解决了吧:)

+0

这就是我正在使用的,因此上面的例子中的“AsExpandable”。 (还是)感谢你的建议。任何其他想法我做错了什么? – 2010-07-12 15:47:02

+0

啊!我发现这个问题,这是由于数据库中包含空格后面的字符串,因此“Equals”不起作用。哎呀!哎呀!哎呀!还是要谢谢你的帮助 :-) – 2010-07-12 16:47:00

0

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

+0

没有例外,它在使用表达式时只是不匹配任何内容。 – 2010-07-09 15:42:40

+0

你确定你的代码使用该表达式吗? 在返回线上放置一个断点,当它在上面时,尝试使用Quickwatch通过替换您用作值的方式来找到使用它的正确方法。 – 2010-07-09 15:50:11

+0

100%确定它使用它两次。 – 2010-07-09 15:51:40

0

我没有编译hnady来测试这一点,但是从IL代码,这似乎是创建一个someId关闭。基本上,它创建了一个func /表达式,编译后将执行&,编译时假定你需要someId在运行时的值,而不是在创建表达式时。我想如果你通过一个临时文件,它应该可以工作。

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

谢谢,这就是我一直在想的。但是,上述情况仍然不能运作。 – 2010-07-12 07:47:45