Csharp/C#教程:动态包含在查询中急切加载的语句 – EF 4.3.1分享


动态包含在查询中急切加载的语句 – EF 4.3.1

我有这个方法:

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’。 存在显式转换(您是否错过了演员?)

有谁知道如何制作包含动态的列表?

谢谢

使query变量可查询:

 public CampaignCreative GetCampaignCreativeById(int id, string[] includes) { using (var db = GetContext()) { var query = db.CampaignCreatives.AsQueryable(); foreach (string include in includes) { query = query.Include(include); } return query .AsNoTracking() .Where(x => x.Id.Equals(id)) .FirstOrDefault(); } } 

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

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

 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>[] 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 ); 

通过使用IQueryable而不是var为编译器提供提示也将起作用。

 IQueryable query = db.CampaignCreatives; // or DbQuery query = db.CampaignCreatives; 

当使用var ,编译器推断出DbSet用于query ,该queryInclude返回的类型(实现IQueryable DbQuery (= DbQuery基类)更具体,所以你可以’ t将结果再分配给query变量。 因此query = query.Include(include)行上的编译器错误。

上述就是C#学习教程:动态包含在查询中急切加载的语句 – EF 4.3.1分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/951285.html

(0)
上一篇 2021年11月18日
下一篇 2021年11月18日

精彩推荐