实体框架核心和FOR JSON AUTO

时间:2019-03-21 01:41:22

标签: json sql-server entity-framework-core

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模型中会很好。

2 个答案:

答案 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;
}