我正在我的 ASP.Net Core 网站中使用NuGet Microsoft.AspNetCore.OData 创建一个OData端点。
我的想法是不公开我的数据库模型并使用 LINQ Select 函数映射它们,以更好地控制哪些属性可以显示在外部,例如谁创建了什么。
将来,由于对数据授予的权限,将向 IEnumerable 中添加更多逻辑。
一切正常。我可以在 ODataController 上获取,过滤和扩展数据。除了一件事,我注意到使用 Entity Framework Core 的调试选项;我发送给 ODataController 的所有内容都是在内存中完成的,而不是通过我期望的通过 Entity Framework 的表达式完成的。每次都要求一切。当然,随着增长,随着时间的流逝,这将成为越来越多的问题。
一些类似于我正在做的代码
public class ExampleModel {
public Guid Id { get; set; }
public string Name { get; set; }
}
public class ExampleDbModel{
public Guid Id { get; set; }
public string Name { get; set; }
}
public class ExampleRepository {
public IEnumerable<ContentItem> Get(string userId)
{
return this._dbContext.Example
.Select(ExampleMapper.Map) // Mapper is pure property to property in this example, same names
.Where(e => e.UserID == userId); // Permissions will be more complex
}
}
public class ExampleController : ODataController
{
// Constructor, properties, DI, ...
[EnableQuery]
public IActionResult Get()
{
return Ok(_exampleRepository.Get(SomeStaticVariableForUserId));
}
}
调用控制器时,我总是注意到Entity Framework Core正在执行以下查询
SELECT [ExampleDbModel].[Id], [ExampleDbModel].[Name]
FROM ExampleDbModel
即使我正在执行 localhost:5050 / odata / examplemodel?$ select = id ,它仍会执行相同的查询加载所有内容。
我想知道如何将OData查询直接转换为 Entity Framework Core ,以尽可能少地加载。