C# 核心逻辑查询

C# 核心逻辑查询,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我有一个C项目,它使用EF核心和MVC 我有一个代表虚拟实体的控制器。该实体是通过从两个不同的表中进行选择,按月份和年份对每个表进行聚合,然后连接两个结果而创建的 我的问题是:有可能吗?如果有,用EF核心求和是一个好的解决方案吗?或者我应该用C遍历元素,并按照我想要的方式聚合它们吗 编辑:目前我正在做以下工作: public IEnumerable<MyTable> Get...(int month, int year) return _context.MyTabl

我有一个C项目,它使用EF核心和MVC

我有一个代表虚拟实体的控制器。该实体是通过从两个不同的表中进行选择,按月份和年份对每个表进行聚合,然后连接两个结果而创建的

我的问题是:有可能吗?如果有,用EF核心求和是一个好的解决方案吗?或者我应该用C遍历元素,并按照我想要的方式聚合它们吗

编辑:目前我正在做以下工作:

 public IEnumerable<MyTable> Get...(int month, int year)
        return _context.MyTable
           //.Include(b => b.)
           .Where(t => t.Month == month && t.Year == year)
           .GroupBy(a => a.BrokerId)
           .Select(param1 => new {
                                   BrokerId = param1.Key,
                                   TotalCommissionAmountBruto = param1.Sum(s => s.CommissionAmountBruto),
                                   TotalCommissionAmountNeto = param1.Sum(s=>s.CommissionAmountNeto)
                       });

有很多方法可以达到这一要求。如果表之间存在父子关系,则可以使用Include和Include

您还可以使用FromSql方法运行存储过程并选择所需的数据

也可以使用“选择扩展”方法使用投影查询

您可以参考Microsoft提供的官方文档了解上述所有内容。

根据问题中显示的代码进行编辑:

您的选择(如图所示)返回的是匿名类型:

.Select(param1 => new {
                         BrokerId = param1.Key,
                         TotalCommissionAmountBruto = param1.Sum(s => s.CommissionAmountBruto),
                         TotalCommissionAmountNeto = param1.Sum(s=>s.CommissionAmountNeto)
                       });
返回视图模型,并应设置:

.Select(param1 => new MyViewModel {
                                    BrokerId = param1.Key,
                                    TotalCommissionAmountBruto = param1.Sum(s => s.CommissionAmountBruto),
                                    TotalCommissionAmountNeto = param1.Sum(s=>s.CommissionAmountNeto)
                       });
然后从以下位置更改操作的返回类型:

public IEnumerable<MyTable> Get...(int month, int year)
以上是分组的基本思想,然后使用一些聚合函数

如果您已经为它编写了SQL,并且更喜欢使用它,那么您也可以使用它,这在一开始可能看起来太有限了,因为您必须将结果映射到一个实体,而您的案例没有。在2.1中,他们将映射添加到虚拟实体、视图模型和定义查询

在2.1中,您可以创建一个视图模型,即您正在调用的虚拟实体,将其添加到EF上下文中,然后您可以使用数据库视图、另一个EF查询和/或具有限制的匿名类型对其进行查询

例如:

给定一个视图模型:

public class MySpecialModel
{  
  public string Name { get; private set; }
  public int Count { get; private set; }
}
您可以将其添加到您的上下文中:

public DbQuery<MySpecialModel> MySpecialModel {get;set;}
如果出于某种原因,这不起作用或限制太大,我建议使用这样的微型ORM,它可以获取原始SQL并将其映射到模型

你提出的更微妙的问题是,这样做好吗

简短回答-可能但始终检查您的SQL,并根据您的需要进行相应调整


回答时间更长-如果不知道查询的复杂性或您现有的EF核心逻辑以及它生成的SQL结果和您的上下文、它的性能、用户数量、调用频率等,我们无法回答此问题

表之间的关系如何?月、年和代理您可以使用join和selectFrom,据我所知,您希望创建一个业务对象,该业务对象由具有各种联接和聚合的不同数据模型对象生成。我要做的是定义一个业务类,并创建一个服务方法来处理带有EF查询的查询并返回您的业务对象。您还可以在数据库级使用视图或存储过程,以及安装EF来了解这些,并对这些视图或存储的PROUEDEURE进行EF调用。EF非常有能力使用LINQ生成请求,使用LINQ,尽管EF核在使用您建议的第一种方式时仍然是非常有限的。我遇到了一个错误,我正在方法中选择数据,我需要知道它返回的数据类型。。在您的示例中,我指的是它抛出的查询无法隐式转换。。。这是有道理的,但是我应该从方法返回哪种类型?我不想返回IENumerable,因为我想更具体一些。谢谢你的帮助。你创建视图模型了吗?示例正在返回匿名类型。请选择G=>new。。。。vs..Selectg=>new MyViewModel。。。。我很难回答你的付出出了什么问题。你的问题本质上是另一个问题。如果您试图用EF Core构造一个查询,并且遇到了一个问题,那么最好再问另一个SO问题,其中包含确切的查询语法、确切的错误以及您要查找的预期结果。那么我们可以更好地帮助您-我已经用额外的数据更新了我的问题。。如果还不够的话,我明天再问一个问题:
var query = context.Orders
    .GroupBy(o => new { o.CustomerId, o.EmployeeId })
    .Select(g => new
        {
          g.Key.CustomerId,
          g.Key.EmployeeId,
          Sum = g.Sum(o => o.Amount),
          Min = g.Min(o => o.Amount),
          Max = g.Max(o => o.Amount),
          Avg = g.Average(o => Amount)
        });
public class MySpecialModel
{  
  public string Name { get; private set; }
  public int Count { get; private set; }
}
public DbQuery<MySpecialModel> MySpecialModel {get;set;}
var results = context.MySpecialModel.FromSql("select name,count from a join b on b.id=a.id)