gpt4 book ai didi

c# - 如何强制 WebAPI OData 扩展子句?

转载 作者:行者123 更新时间:2023-11-30 16:59:10 26 4
gpt4 key购买 nike

使用 Microsoft WebAPI OData 版本 5.6 (OData v3),如果我有以下自定义模型/DTO:

public class ParentObject
{
public int ID { get; set; }
public string Title {get; set;}
public ChildObject Child { get; set;}
}

public class ChildObject
{
public string Value { get; set;}
}

以及将我的数据库投影到模型中的以下 Controller :

public class ParentsController : ODataController
{
public IQueryable<ParentObject> Get()
{
var db = new MyDBContext();
var results = from p in db.parent
select new ParentObject
{
ID = p.id,
Title = p.title,
Child = p.child == null ? null : new ChildObject
{
Value = p.child.value
}
};

return results;
}
}
}

如何在消费者无需在 url 中指定 $expand=Child 的情况下强制展开“Child”?

我想:
1. 检查消费者是否已经指定了 $expand=Child
2. 如果“Child”尚未包含在扩展列表中,请包含它。
3.一定要尊重任何其他查询选项

我看过几篇我不清楚的在线文章,或者引用了不再匹配的旧版本的 api。

我尝试将 Action 修改为“Get(ODataQueryOptions opts)”,这让我可以执行以下操作:

if(opts.SelectExpand == null || !opts.SelectExpand.RawExpand.Contains("Child"))
{
// Add/modify expand clause here.
}

但是我不清楚如何修改或构建我自己的 ODataQueryOptions 对象,维护所有其他查询选项,然后将其应用于结果。

更新 1

我取得了一些进步。这是对 Controller 的相关更改(dbcontext 查询与上面相同):

public PageResult<ParentObject> Get(ODataQueryOptions opts)
{
SelectExpandQueryOption expandOpts = null;
if(opts.SelectExpand != null && !opts.SelectExpand.RawExpand.Contains("Child"))
{
expandOpts = new SelectExpandQueryOption(opts.SelectExpand.RawSelect, string.Join(",", new string[] {"Child", opts.SelectExpand.RawExpand }), opts.Context);
}
else if (opts.SelectExpand == null)
{
expandOpts = new SelectExpandQueryOption(null, "Child", opts.Context);
}

// Query from above goes here

if(expandOpts != null)
{
Request.SetSelectExpandClause(expandOpts.SelectExpandClause);
}

var qSettings = new ODataQuerySettings();
qSettings.PageSize = 100;

results = opts.ApplyTo(results, qSettings).AsQueryable() as IQueryable<ParentObject>;
return new PageResult<ParentObject>(results, Request.GetNextPageLink(), Request.GetInlineCount());
}

当我不包含“$expand”查询选项(已创建 expandOpts)时,这似乎工作正常。但是,当出现“$expand”时,我在返回语句中收到 ArgumentNullExcpetion 并且无法弄清楚原因。

最佳答案

我自己研究了好几个小时后,这就是答案。您需要设置扩展字符串并执行包含以使其正常工作。

[EnableQuery]
public IQueryable<Student> Get_Student(ODataQueryOptions<Student> queryOptions)
{
var db = new EfCustomAdapter();

var expandOpts = new SelectExpandQueryOption(null, "Parent,Schools", queryOptions.Context);
var q = db.Student.AsQueryable();
q = q.Include(t => t.Parent);
q = q.Include(t => t.Schools);
queryOptions.Request.ODataProperties().SelectExpandClause = expandOpts.SelectExpandClause;
return q;
}

更新:如果您需要扩展级别低于语法是..“ parent 、学校、账单/付款”

付款对象是账单的导航属性。

关于c# - 如何强制 WebAPI OData 扩展子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24167484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com