【问题标题】:How to improve this Entity Framework Core query?如何改进这个 Entity Framework Core 查询?
【发布时间】:2020-01-15 22:43:05
【问题描述】:

我正在编写一个只读的网络应用程序,我的意思是从数据库中读取数据并呈现在 UI 中,所以我的 BLL 服务方法主要包括 linq 查询,例如:

return context.SomeLinqQuery

如果我需要一些计算,我会在 Select() 方法中进行,我想知道它是否正确?

另一个问题是 - 在下面的示例查询中编写更好的方法是什么?我想按照良好实践编写代码,我不确定将所有内容放在Select() 中是否是其中之一。

我也想知道,如果在Select() 中调用_context 是否错误。如果是错误的,我该如何解决?我应该在附加循环中加载SomeProperty 吗?

_context.SomeEntity
        .Where(some condition)
        .Select(x => new MyModel()
                {
                    Id = x.Id,
                    Name = x.Name,
                    SomeProperty = x.Status == 1
                        ? _context.DbViewModel.Where(condition).Select...
                        : _context.AnotherDbViewModel.Where(condition).Select...
                });

【问题讨论】:

  • 没有错,但您不需要在正确投影的域中这样做

标签: entity-framework linq asp.net-core entity-framework-core


【解决方案1】:

如果我需要一些计算,我会在 Select() 方法中进行,我想知道它是否正确?

是的!正确的!只要 EF Core 能够将您的LINQ 查询生成的表达式转换为T-SQL

另一个问题是 - 在下面的示例查询中编写更好的方法是什么?我想按照良好实践编写代码,我不确定将所有内容放在Select() 中是否是其中之一。

这将取决于您的实体之间的关系。最好使用导航属性构建查询。

我也想知道,如果在 Select() 内调用 _context 是否错误。如果是错误的,我该如何解决?我应该在附加循环中加载 SomeProperty 吗?

如果 EF Core 能够在数据库级别评估查询,则没有错。

【讨论】:

    【解决方案2】:

    改进EF Query的方法是让DB做所有的Query,直接返回期望的视图。

    我不能贡献更多代码,但你的代码应该类似这样:

    _context.SomeEntity
        .Join(DbViewModel,condition)...
        .Join(AnotherDbViewModel,condition)...
        .Where(some condition)
        .Select({
                    Id = x.Id,
                    Name = x.Name,
                    SomeProperty = x.SomePropety.
                })
    

    另一种解决方案是使用DBQueryHere 就是一个很好的例子。另外,使用ExecuteSqlCommandFromSQL

    如果您的 LINQ 非常复杂,您还可以使用CompiledQuery 进行更多改进。

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      相关资源
      最近更新 更多