繁体   English   中英

如何使用实体框架核心编写异步连接?

[英]How to write an async concat with Entity Framework core?

我正在研究 .NET 6 项目。

以下是我的查询:

var data = await _context.Claims.AsNoTracking()                                     
.Where(cl=>cl.Contract.User.Email==email)
                            .Select(cl=>new ClaimDTO
                                                {
                                                id=cl.id,
                                                desc=cl.desc
                                                })                            
                            .ToListAsync();

这是我的第二个查询:

var data2 = await _context.HistoricalClaims.AsNoTracking()                                     
.Where(cl=>cl.Contract.User.Email==email)
                            .Select(cl=>new ClaimDTO
                                                {
                                                id=cl.id,
                                                desc=cl.desc
                                                })                            
                            .ToListAsync();

我想学习如何在 SQL 服务器和客户端进行 UNION ALL。

这是我在 SQL 服务器上尝试执行的代码:

var data = await _context.Claims.AsNoTracking()                                     
.Where(cl=>cl.Contract.User.Email==email)
                            .Select(cl=>new ClaimDTO
                                                {
                                                id=cl.id,
                                                desc=cl.desc
                                                })                            
               .Concat(await _context.HistoricalClaims.AsNoTracking()                                     
               .Where(cl=>cl.Contract.User.Email==email)
                            .Select(cl=>new ClaimDTO
                                                {
                                                id=cl.id,
                                                desc=cl.desc
                                                })  
                                     )
                            .ToListAsync();

有人可以更正我的查询以在 sql 服务器上执行联合。

其次,假设我运行 2 个单独的查询并且响应保存在 data 和 data1 变量中,那么以下语法是否正确? vat result = data.Concat(data1);

我想你很接近。 不需要Concat()中的await

var items = await context.Items
    .Where(w => w.ItemNo == 4)
    .Select(s => new Dto { Name = s.Desc, Num = s.ItemNo })
    .Concat(
        context.ItemsHistory
            .Where(w => w.ItemNo == 4)
            .Select(s => new Dto { Name = s.Desc, Num = s.ItemNo })
        )
    .ToListAsync();

此 SQL 查询的结果:

SELECT [i].[Desc] AS [Name], [i].[ItemNo] AS [Num]
FROM [Items] AS [i]
WHERE [i].[ItemNo] = 4
UNION ALL
SELECT [i0].[Desc] AS [Name], [i0].[ItemNo] AS [Num]
FROM [ItemsHistory] AS [i0]
WHERE [i0].[ItemNo] = 4

关于您的第二个问题:是的,只要类型相互兼容,您就可以在具体化后将两个列表连接在一起:

public static IEnumerable<TSource> Concat<TSource>(
  this IEnumerable<TSource> first,
       IEnumerable<TSource> second)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM