EF Core是否为SQL Server支持FOR JSON AUTO
?我的数据库中有视图,我想查询该视图(同时使用WHERE子句对其进行过滤),并将数据以FOR JSON AUTO
的形式返回给我。
我想按照以下方式做些事情:
string json = context.UsersView.Where(x => x.Id == userId).ForJson();
UsersViewModel model = JsonConvert.DeserializeObject<UsersViewModel>(json);
或者语法会变。关键是,我想利用SQL Server的FOR JSON AUTO
子句。是否存在?我会在视图定义中包括FOR JSON AUTO
,但这无济于事,因为如果这样定义,就无法向视图中添加WHERE
子句。另外,如果我完全想念一种更好的方法,请放心。但是请记住,我希望POCO模型具有嵌套对象。
我找不到一种干净的方法,尽管这样做非常有帮助,因为我的视图非常复杂,将FOR JSON结果与嵌套对象等一起传递到POCO模型中会很好。
答案 0 :(得分:0)
显然,使用Entity Framework Core尚无干净的方法。我最终使用了存储过程,在其中传递了filter参数并为json选择数据。
它按预期的方式工作,只是希望EF能够合并格式。看来这很容易。
答案 1 :(得分:0)
SQL过程示例:
create procedure MyProcedure
(
@Parameter int
)
as
begin
declare @result nvarchar(max);
set @result = (
select u.*
,(
select ue.*
from UserEmails ue
where ue.UserId = u.Id
for json path, include_null_values
) as Emails
from Users u
where u.UserType = @Parameter
for json path, include_null_values
)
select @result;
end
将以下扩展类添加到上下文附近的文件夹中: https://github.com/snickler/EFCore-FluentStoredProcedure/blob/master/EFCoreFluent/src/EFCoreFluent/EFExtensions.cs
此扩展类将允许您在上下文中执行过程,如下所示:
public async Task<MyProcedureModel> GetMyProcedureJsonModel(int userTypeId)
{
string result = string.Empty;
await _clientContext.LoadStoredProc("MyProcedure")
.WithSqlParam("@Parameter", userTypeId)
.ExecuteStoredProcAsync((handler) =>
{
result = handler.ReadToString();
});
MyProcedureModel model = null;
if (result != null)
{
model = JsonConvert.DeserializeObject<MyProcedureModel>(result);
}
return model;
}