实体框架包括 vs where

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)

Cod*_*lla 5

您可能误解了该Include函数的实际作用。选项 1 纯粹是一种查询语法,它对实体框架返回的内容没有影响。选项 2,该Include函数指示实体框架在返回查询结果时从数据库中Eagerly Fetch相关行。

所以选项 1 将导致一些连接,但查询的“选择”部分将被限制在OptiDashboards表中。

选项 2 也将导致连接,但在这种情况下,它将返回所有包含的表的结果,这显然会引入更多的性能损失。但同时,结果将包括您需要的所有相关实体,避免 [可能] 需要对数据库进行更多往返。