c# - 在查询中预先加载的动态包含语句 - EF 4.3.1

标签 c# entity-framework c#-4.0 entity-framework-4.1 entity-framework-4.3

我有这个方法:

public CampaignCreative GetCampaignCreativeById(int id)
        {
            using (var db = GetContext())
            {
                return db.CampaignCreatives
                    .Include("Placement")
                    .Include("CreativeType")                    
                    .Include("Campaign")
                    .Include("Campaign.Handshake")
                    .Include("Campaign.Handshake.Agency")
                    .Include("Campaign.Product")
                    .AsNoTracking()
                    .Where(x => x.Id.Equals(id)).FirstOrDefault();
            }
        }

我想使包含列表动态化。我试过:

public CampaignCreative GetCampaignCreativeById(int id, string[] includes)
        {
            using (var db = GetContext())
            {
                var query = db.CampaignCreatives;

                foreach (string include in includes)
                {
                    query = query.Include(include);
                }

                return query.AsNoTracking()
                    .Where(x => x.Id.Equals(id)).FirstOrDefault();                    
            }
        }

但它没有编译。我收到此错误:

无法将类型“System.Data.Entity.Infrastructure.DbQuery”隐式转换为“System.Data.Entity.DbSet”。存在显式转换(是否缺少强制转换?)

有谁知道如何使包含列表动态化?

谢谢

最佳答案

我更喜欢定义包含的非字符串表达方式。主要是因为它不依赖于魔法字符串。

对于示例代码,它看起来像这样:

public CampaignCreative GetCampaignCreativeById(int id) {
    using (var db = GetContext()) {
        return db.CampaignCreatives
            .Include(cc => cc.Placement)
            .Include(cc => cc.CreativeType)                    
            .Include(cc => cc.Campaign.Select(c => 
                 c.Handshake.Select(h => h.Agency)))
            .Include(cc => cc.Campaign.Select(c => c.Product)
            .AsNoTracking()
            .Where(x => x.Id.Equals(id))
            .FirstOrDefault();
    }
}

要使这些动态化,您可以这样做:

public CampaignCreative GetCampaignCreativeById(
    int id, 
    params Expression<Func<T, object>>[] includes
) {
    using (var db = GetContext()) {
        var query = db.CampaignCreatives;
        return includes
            .Aggregate(
                query.AsQueryable(), 
                (current, include) => current.Include(include)
            )
            .FirstOrDefault(e => e.Id == id);
    }
}

它是这样使用的:

var c = dataService.GetCampaignCreativeById(
     1, 
     cc => cc.Placement, 
     cc => cc.CreativeType, 
     cc => cc.Campaign.Select(c => c.Handshake.Select(h => h.Agency)),
     cc => cc.Campaign.Select(c => c.Product
);

关于c# - 在查询中预先加载的动态包含语句 - EF 4.3.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10001061/

相关文章:

c# - 代码中特定行的目的是什么

c# - 从 C# 代码构建跨平台共享库

.net - 在 Entity Framework 事务中使用 SqlConnection

c# - 在 windows 启动时设置 c# windows 应用程序

c# - .NET 4.0 EDMX从模型生成数据库,然后执行SQL从表中删除数据

c# - 将 JSON 对象映射到 C# 类属性

C# 程序在速度较慢的 PC 上运行速度更快,反之亦然

c# - C# webAPI 项目中的循环引用问题

c# - 如何从 Visual Studio 中的包管理器控制台针对 SQL Azure 调用更新数据库?

c# - Entity Framework Core 2.0 添加迁移不生成任何内容