指示Linq实体解析函数的结果,而不是函数调用

时间:2010-02-19 18:50:34

标签: entity-framework linq-to-entities

我在EDM之外有一个函数,我希望将其包含在我的一些Linq to Entities表达式中。该函数返回Int的IEnumerable。我如何使用它的一个例子是:

context.Employees.Where(e => GetValidEmployeeIds().Contains(e.EmployeeId));

函数GetValidEmployeeIds是返回IEnumerable的函数。这个函数的结果不是我可以从数据库获得的东西 - 我几乎必须从EDM外部获取它。

当我执行代码行时,我得到“LINQ to Entities无法识别方法” - 这是因为。但是,如果我打破表达式的调用,它可以正常工作:

var validEmployees = GetValidEmployeeIds(); 
context.Employees.Where(e => validEmployees.Contains(e.EmployeeId));

我的问题是:我可以做些什么来指示Linq to Entities不将该函数解析为表达式的一部分吗?改为解析函数的结果。我希望有一个属性,我可以装饰方法,但无法找到一个。

通常情况下,只要断开调用而不直接在表达式中使用它,我就没问题了。但是,我将要使用这个调用很多,并希望稍微清理一下代码。

1 个答案:

答案 0 :(得分:1)

不,你需要移动函数调用:

即,这:

var q = Context.Entities.Where(e => e.Something == DoStuff());

......必须成为:

var stuff = DoStuff();
var q = Context.Entities.Where(e => e.Something == stuff);

但是,如果你可以将你的功能放到Expression,那么你可以直接使用它:

var stuff = DoStuff();
Expression<Func<Entity, bool>> predicate = e => e.Something == stuff;
var q = Context.Entities.Where(predicate);

...所以你可以用这种方式清理剪切和粘贴。