C# LINQ展平嵌套对象的列表

5vf7fwbs  于 2022-12-15  发布在  C#
关注(0)|答案(1)|浏览(155)

我正在通过EF核心从数据库的五个不同表中选择相同的对象。我想在一次数据库调用中完成。因此,我有匿名对象的IQueryable,其中包含五个相同类型的对象。在调用ToListAsync()之前,我如何将其扁平化?

var q = from people in _dataContext.People.DefaultIfEmpty()
                from groups in _dataContext.Groups.DefaultIfEmpty()
                from contracts in _dataContext.Contracts.DefaultIfEmpty()
                from activities in _dataContext.ActivityTypes.DefaultIfEmpty()
                from vehicles in _dataContext.Vehicles.DefaultIfEmpty()
                select new
                {
                    Person = new RightsEntity
                    {
                        ...
                    },
                    Group = new RightsEntity
                    {
                        ...
                    },
                    Contract = new RightsEntity
                    {
                        ...
                    },
                    Activity = new RightsEntity
                    {
                       ...
                    },
                    Vehicle = new RightsEntity
                    {
                        ...
                    }

我可以想象从数据库加载后做它。但有什么办法让EF核心这样做吗?我还没有找到任何答案,将适合我的情况。

fwzugrvs

fwzugrvs1#

您需要将每个表的输出扁平化为一个公共类型,然后进行联合,因为您已经将公共类型定义为RightsEntity,您可以从每个表中选择它:

var q = _dataContext.People.Select(r => new RightsEntity() { ... }).Union(
        _dataContext.Groups.Select(r => new RightsEntity() { ... })).Union(
        _dataContext.Contracts.Select(r => new RightsEntity() { ... })).Union(
        _dataContext.ActivityTypes.Select(r => new RightsEntity() { ... })).Union(
        _dataContext.Vehicles.Select(r => new RightsEntity() { ... }));

这应该在SQL服务器上作为单个批处理运行,如下所示:

SELECT t1.SomeField1FromTableT1 AS CommonField1, t1.SomeField2FromTableT1 AS CommonField2 FROM People t1
UNION
SELECT t2.SomeField1FromTableT2 AS CommonField1, t2.SomeField2FromTableT2 AS CommonField2 FROM Groups t2
UNION
...

相关问题