【发布时间】:2012-03-16 15:18:44
【问题描述】:
如何将此实体框架 LINQ 查询编写为编译查询?
var context = new SlxDbContext();
var userSet = context.Set<User>();
User user = userSet.Where(x => x.UserName == "gstrader").First();
【问题讨论】:
标签: linq entity-framework
如何将此实体框架 LINQ 查询编写为编译查询?
var context = new SlxDbContext();
var userSet = context.Set<User>();
User user = userSet.Where(x => x.UserName == "gstrader").First();
【问题讨论】:
标签: linq entity-framework
在使用 DbContext API 时无法使用 CompiledQuery; CompiledQuery 仅适用于 ObjectContext。如果您使用 Code First,您很可能使用 DbContext API。 Microsoft 建议您在新项目中使用 DbContext API,即使您将使用 Database First 或 Model First 模型。
但如果您使用 EF5,它会带来自动编译查询,其工作方式与 CompiledQuery 大不相同。 EF5 无需您编写代码来编译每个查询,然后根据需要调用每个查询,而是将生成的 SQL 缓存为后台进程,然后在您执行任何查询时在缓存中搜索已编译的查询。
见:
和
http://www.devproconnections.com/article/entity-framework/entity-framework-5-143875
【讨论】:
很遗憾,您使用的 EF 版本(代码优先),不支持编译查询。
如果我错了,请纠正我。
一些链接:
How do I precompile an Entity Framework Code-First Query?
EF Code First DbContext and Compiled Queries
更新:
这是编译查询的示例,但我认为它不适用于 Code First:
public static Shop CompiledGetShopById(Guid shopId)
{
using (DataContext dtx = new DataContext(ConfigProvider.ConnectionString)) {
return Compiled_GetById.Invoke(dtx, shopId);
}
}
private static Func<DataContext, Guid, Shop> Compiled_GetById =
Objects.CompiledQuery.Compile<DataContext, Guid, Shop>(
(DataContext db, Guid shopId) =>
(from item in db.Shops where item.ShopId == shopId)
.FirstOrDefault()
);
【讨论】: