Nic*_*k B 2 c# sql entity-framework azure-sql-database
我的数据库结构是这样的:一个通过表OptiUser属于多个UserGroups IdentityMap,这是一个匹配的表(多对多),附加了一些附加属性。每个UserGroup都有多个OptiDashboards。
我有一个标识特定用户的 GUID 字符串(wlid在此代码中)。我想获得的IEnumerable所有的OptiDashboards供标识的用户wlid。
这两个 Linq-to-Entities 查询中哪个最有效?它们在后端的运行方式是否相同?
另外,我可以将选项 2 的Include语句缩短为仅.Include("IdentityMaps.UserGroup.OptiDashboards")吗?
using (OptiEntities db = new OptiEntities())
{
// option 1
IEnumerable<OptiDashboard> dashboards = db.OptiDashboards
.Where(d => d.UserGroups
.Any(u => u.IdentityMaps
.Any(i => i.OptiUser.WinLiveIDToken == wlid)));
// option 2
OptiUser user = db.OptiUsers
.Include("IdentityMaps")
.Include("IdentityMaps.UserGroup")
.Include("IdentityMaps.UserGroup.OptiDashboards")
.Where(r => r.WinLiveIDToken == wlid).FirstOrDefault();
// then I would get the dashboards through user.IdentityMaps.UserGroup.OptiDashboards
// (through foreach loops...)
}
Run Code Online (Sandbox Code Playgroud)
您可能误解了该Include函数的实际作用。选项 1 纯粹是一种查询语法,它对实体框架返回的内容没有影响。选项 2,该Include函数指示实体框架在返回查询结果时从数据库中Eagerly Fetch相关行。
所以选项 1 将导致一些连接,但查询的“选择”部分将被限制在OptiDashboards表中。
选项 2 也将导致连接,但在这种情况下,它将返回所有包含的表的结果,这显然会引入更多的性能损失。但同时,结果将包括您需要的所有相关实体,避免 [可能] 需要对数据库进行更多往返。
| 归档时间: |
|
| 查看次数: |
4643 次 |
| 最近记录: |