gpt4 book ai didi

c# - 使用 ODataQueryOptions 时无法应用 $select

转载 作者:太空宇宙 更新时间:2023-11-03 14:43:24 25 4
gpt4 key购买 nike

我正在尝试通过 EF Core 和 OData(7.1.0) 实现对 Sql Server 的查询。

操作方法如下:

[HttpGet]
public IEnumerable<UserInfoDto> Get(ODataQueryOptions ops)
{
return this.service.GetUserInfos(ops);
}

服务代码:

public List<UserInfoDto> GetUserInfos(ODataQueryOptions ops)
{
using (var context = new EFContext())
{
var query = context.Users.Join(context.Customers, x => x.CustomerId, y => y.Id, (x, y) => new UserInfoDto
{
Id = x.Id,
Name = x.Name,
Age = x.Age,
CustomerId = x.CustomerId,
CustomerTitle = y.Title,
CustomerDescription = y.Description
});

var result = ops.ApplyTo(query).Cast<UserInfoDto>().ToList();
return result;
}
}

启动Configute方法:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMvc(b =>
{
b.Count().Filter().OrderBy().Select().MaxTop(null);
b.EnableDependencyInjection();
});
}

但是,当我在查询中使用 $select 时(例如 https://localhost:5001/api/userinfos?$select=id ),我得到的不是预期结果而是错误:

InvalidOperationException: No coercion operator is defined between types 'Microsoft.AspNet.OData.Query.Expressions.SelectExpandBinder+SelectSome`1[Oda taApp.UserInfoDto]' and 'OdataApp.UserInfoDto'.



我错过了什么?感谢您的帮助。

最佳答案

当您使用 $select 时OData 的查询选项,您需要 dynamic 的 IQueryable .

例如,想象一下下面的类:

public class Person {
public int Id { get; set }
public string Name { get; set; }
}

因此,如果您的查询没有 $select , IQueryable 将生成一个 Person 的集合,每个项目中都有所有属性(id 和 name)。

但是,如果您使用 $select=id查询,每个项目将只有 ID 属性,您不能将动态类型转换为 Person 类型。

换句话说,你不能使用$select并返回 List<UserInfoDto> , 你需要返回一个 List<dynamic>没有 Cast 方法,就像这样:

    var result = ops.ApplyTo(query) as IQueryable<dynamic>;
return result.ToList();

编辑:

方法的完整实现将是:

// changing the return type
public List<dynamic> GetUserInfos(ODataQueryOptions<UserInfoDto> ops)
{
using (var context = new EFContext())
{
var query = context.Users.Include(Customers, x => x.CustomerId, y => y.Id, (x, y) => new UserInfoDto
{
Id = x.Id,
Name = x.Name,
Age = x.Age,
CustomerId = x.CustomerId,
CustomerTitle = y.Title,
CustomerDescription = y.Description
});
// casting the applyto result
var result = ops.ApplyTo(query) as IQueryable<dynamic>;
return result.ToList();
}
}

关于c# - 使用 ODataQueryOptions 时无法应用 $select,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55636167/

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