使用实体框架可重用获取查询

问题描述 投票:0回答:1

您有一个包含 50 列的表

Person
。有时您想要查询 2 列,有时想要查询 10 列等。然后您使用实体框架选择从数据库中仅获取所需的列以改进查询。

PersonRepository

public PersonDto1 GetForSmallValidation()
{
    return context.Persons.Select(x => 
        new PersonDto1
        {
            Id = x.Id,
            LastName = x.LastName,
        }
    );
}

public PersonDto2 GetActive()
{
    return context.Persons
        .Filter(x => x.Active)
        .Select(x => 
            new PersonDto2
            {
                Id = x.Id,
                LastName = x.LastName,
                FirstName = x.FirstName,
                ... // all fields
            }
        );
}

如果某些用例需要:额外的列、

.Include()
、过滤器,那么我需要一个单独的
Get
方法和 Dto 来满足所有这些需求。这些方法很难重用和管理。我觉得这是一个不好的做法,我需要一些泛型或可重用的方法。当我查询数据库时,我应该能够轻松地从调用服务中指定包含、特定列、过滤器。

问题:如何使用 EF 处理仅查询特定列?无论是使用存储库模式还是不通过在服务层调用

DbContext

我的初步解决方案和研究结果:

  1. 我在高效查询中发现我需要匿名C#类型:

     return new { column1, column2 }
    

    问题:我是否返回动态类型或者如何更改我的方法?

     public dynamic GetForSmallValidation() {..}
    
  2. 我在存储库模式中找到了一种通用的

    Get
    方法,它将帮助我只编写一个
    Get

    问题:这如何与我的多个 Dtos(或 C# 匿名类型)集成?这个
    Get
    将有一个泛型作为数据库实体
    Person
    ,并且方法返回
    PersonDto
    或匿名类型。

  3. 甚至不考虑每个字段都可为空的 Dto。我无法检查每个字段的

    HasValue

c# .net performance entity-framework repository-pattern
1个回答
0
投票

您刚刚发现了为什么您的存储库应该具有返回

IQueryable<Person>
而不是 DTO 的方法。 您可以编写任何您想要的查询并将返回结果投影到实体、匿名类型或 DTO 中。

幸运的是,您的 DbContext 已经是这样一个存储库,因此您不需要额外的存储库。

© www.soinside.com 2019 - 2024. All rights reserved.