C# 由于DTO映射,OdataController查询计划不是最优的
将DAL对象映射到DTO对象时,我得到了一个意外的查询 我有一些DAL对象:C# 由于DTO映射,OdataController查询计划不是最优的,c#,asp.net-web-api,odata,C#,Asp.net Web Api,Odata,将DAL对象映射到DTO对象时,我得到了一个意外的查询 我有一些DAL对象: public class MainDalObject { public Guid Id { get; set;} public string Description { get; set; } public ICollection<SubDalObject> Subs { get; set; } } public class SubDalObject { public Guid
public class MainDalObject
{
public Guid Id { get; set;}
public string Description { get; set; }
public ICollection<SubDalObject> Subs { get; set; }
}
public class SubDalObject
{
public Guid Id { get; set;}
public string Description { get; set; }
public MainDalObject Main { get; set; }
}
公共类MainDalObject
{
公共Guid Id{get;set;}
公共字符串说明{get;set;}
公共ICollection Subs{get;set;}
}
公共类子对象
{
公共Guid Id{get;set;}
公共字符串说明{get;set;}
公共MainDalObject Main{get;set;}
}
还有我的DTO课程:
public class MainObject
{
public Guid Id { get; set;}
public string Name { get; set; }
public IEnumerable<SubObject> Subs { get; set; }
}
public class SubObject
{
public Guid Id { get; set;}
public string Name { get; set; }
public MainDalObject Main { get; set; }
}
public类main对象
{
公共Guid Id{get;set;}
公共字符串名称{get;set;}
公共IEnumerable子{get;set;}
}
公共类子对象
{
公共Guid Id{get;set;}
公共字符串名称{get;set;}
公共MainDalObject Main{get;set;}
}
我的MainObject控制器包含一个IQueryable方法:
public IQueryable<MainObject> Get()
{
return (from m in Context.Get<MainDalObject>()
select new MainObject
{
Id = m.Id,
Name = m.Description,
Subs = m.Subs.Select(s => new SubObject
{
Id = s.Id,
Name = s.Name
}
});
}
public IQueryable Get()
{
返回(从Context.Get()中的m)
选择新的主对象
{
Id=m.Id,
名称=m.说明,
Subs=m.Subs.选择(s=>新建子对象
{
Id=s.Id,
Name=s.Name
}
});
}
这很好,但是查询不是最优的。当我在/api/main对象上触发查询时,我根本没有选择子项。但是当我查看查询时,它仍然在选择子项
但是,当我将查询更改为/api/MainObject?$select=Id,Name时,查询没有选择子对象
因此,我所期望的是,在WebApi框架中的某个地方,当没有使用SelectExpandFilter时,responsewriter正在执行ToList(),而没有指定Select语句
我正在寻找修复此问题的最佳位置,我可能会设置一个select expand ODataQueryOption,该选项可能会伪造select或expand调用,但我不确定这是否是解决此问题的方法。如果其他人遇到此问题,这就是我修复此问题的方法。select expand查询应该从reques中的edmmodel派生t上下文,但它基本上就是这样工作的
public virtual IQueryable<TDTO> Get(ODataQueryOptions queryOptions)
{
if (queryOptions.SelectExpand == null)
{
var selectOption = new SelectExpandQueryOption("Id,Name", string.Empty, queryOptions.Context);
Request.SetSelectExpandClause(selectOption.SelectExpandClause);
}
return (from m in Context.Get<MainDalObject>()
select new MainObject
{
Id = m.Id,
Name = m.Description,
Subs = m.Subs.Select(s => new SubObject
{
Id = s.Id,
Name = s.Name
}
});
}
公共虚拟iQueryTable获取(ODataQueryOptions查询选项)
{
if(queryOptions.SelectExpand==null)
{
var selectOption=new SelectExpandQueryOption(“Id,Name”,string.Empty,queryOptions.Context);
Request.setselectexpand子句(selectOption.selectexpand子句);
}
返回(从Context.Get()中的m)
选择新的主对象
{
Id=m.Id,
名称=m.说明,
Subs=m.Subs.选择(s=>新建子对象
{
Id=s.Id,
Name=s.Name
}
});
}