小编Max*_*ikh的帖子

EF Core 3.1 生成 ORDER BY (SELECT 1) 这会破坏旧代码

我正在将我们的项目从 .net core 2.1 升级到 3.1,并且我面临着以下 EF 问题。我有以下代码:

var all = this.Context.Devices.OrderBy(c => c.Id).Where(predicate).Distinct();
var result = await all.Skip(pagedRequest.Offset).Take(pagedRequest.Limit).ToListAsync();
var totalCount = await all.CountAsync();
Run Code Online (Sandbox Code Playgroud)

这基本上用于分页,并且还向客户端提供总元素数。Predicate 是动态生成的过滤条件。为什么 Distinct() 真的被使用了我还没有弄清楚(这是我面临的一些旧代码)。人们很可能会争论是否需要,但这当然是有效的,因此不会改变问题。但是会生成以下 SQL:

 SELECT [d].[Id], ...
FROM [Device] AS [d]
WHERE ([d].[State] = 2) AND EXISTS (
    SELECT 1
    FROM [AnotherTable] AS [r]
    WHERE ([d].[Id] = [r].[DeviceId]) AND ([r].[UserId] = 1))
ORDER BY (SELECT 1)
OFFSET 0 ROWS FETCH NEXT 50 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

比我得到ORDER BY items must appear in the select list if …

.net sql sql-server entity-framework core

1
推荐指数
1
解决办法
669
查看次数

Byte[] 在 REST API 中作为 base64 返回

我有一个从 Swagger 自动生成的 API,其中响应对象有一个 binary field MyBinaryMyBinary在 Swagger 中定义为:

MyReponse:
  type: object
  properties:
    MyBinary:
      type: string
      format: binary
Run Code Online (Sandbox Code Playgroud)

这将生成一个 C# 对象:

pubic class MyResponse
{
  public byte[] MyBinary {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

当我在 Postman 中调用这个 EP 时,我看到它MyBinary以 base64 编码的字符串形式返回:

{
  "MyBinary": "....ydCB1bmQgUXVhcms="
}
Run Code Online (Sandbox Code Playgroud)

里面有一个图像。我希望该字段包含类似?PNG ???? IHDR???È???È?.....

为什么以及在哪里进行 base64 编码?我找不到有关该主题的体面 Swagger 描述或 .net 文档。

问题是我们有 3 个 API 客户端:iOS、Android 和 Web。iOS 成功地Data从 Swagger生成类型,并以某种方式设法自动将 base64 加载到其中,但 Android (Java) 和 Web (TypeScript) 抛出异常,表示他们期望二进制文件但收到字符串。

有人可以向我解释一下,为什么 byte[] 在 .net …

c# swagger .net-core asp.net-core swagger-codegen

1
推荐指数
1
解决办法
199
查看次数