动态包含在查询中急切加载的语句 – 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
,该query
比Include
返回的类型(实现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