C# 由于DTO映射,OdataController查询计划不是最优的

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

将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 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
}
});
}