【发布时间】:2013-11-07 13:08:30
【问题描述】:
问题描述
在我的应用程序中,我有一个搜索功能,它基于 EntityFramework DbSet 对象之上的用户输入构建一个复杂的搜索查询,并针对数据库运行它,如下所示:
public static IQueryable<MyEntity> ApplySearchQuery(SearchSpec search, IQueryable<MyEntity> query)
{
if (search.Condition1.HasValue)
query = query.Where(e => e.SomeProperty == search.Condition1);
if (search.Condition2.HasValue)
query = query.Where(e => e.OtherProperty == search.Condition2);
....
}
这在数据库方面表现得很好。现在我发现我手头只有一个MyEntity,我想看看一个特定的SearchSpec 是否与实体匹配。而且我需要为可能大量的SearchSpec 对象执行此操作,因此性能很重要。
我也很想避免重复表达。
这是我目前的想法:
我可以在表达式上调用
Expression.Compile()以将它们转换为委托,然后调用它们。但是由于我有一个参数(search参数),我需要构建表达式并每次都编译它们,这是一种非常低效的方式(我想,如果我错了,请纠正我)。我可以使用
new [] { myEntity }.AsQueriable()将我的单个实体包装在IQueriable中,然后评估其上的查询。不确定这会表现如何。
问题:
- 以上哪种方法更快?
- 我的任何假设(关于限制)是否错误?
- 还有其他我没有想到的方法吗?
【问题讨论】:
-
这种方法 -
new [] { myEntity }.AsQueriable()- 对我来说似乎没问题。至少,将单个myEntity从数组转换为IQueryable<MyEntity>不会对性能造成重大影响。 -
@Dennis 是的,这是真的。我担心的是底层可查询的执行方式。例如,如果布尔条件(表达式)被编译然后执行,它并不比第一种方法好。
标签: c# entity-framework lambda