从表格中获取总和并显示在剃刀视图中

本文关键字:显示 剃刀 视图 表格 获取 | 更新日期: 2023-09-27 17:58:20

我有两个这样的表表1:动物

Country  Lion Tiger State
india     4      5   Madhya Pradesh
india     10     2   Utrakhand
Russia    0      10  Primorsky krai
Russia    1      20  Khabarovsk Krai

和表2:Project_Tiger

Country  No
India    10
Russia   5

我已经创建了像这个这样的可循环类

public animal animal {get;set;};
public project_tiger project_tiger {get;set;};

现在我想在视图中显示这样的结果

Country  NO  lion   tiger
india    10   14     7
Russia   5    1      30

这里的狮子和老虎是表1中两项记录的总和10+4=15,5+2=7,印度和俄罗斯相同

现在我不知道如何使用linq从数据库中查询这些数据作为总和,以及如何在剃刀视图中显示这一点

我可以像这样用sql编写查询,但不能将其转换为linq

select animal.country, No,  sum(lion), sum(tiger) from animal
       inner join project_tiger ON animal.country equals project_tiger.country

如有任何帮助,我们将不胜感激。

从表格中获取总和并显示在剃刀视图中

您基本上需要连接这两个表,并根据国家名称对结果进行分组,然后生成结果。

var groupd = (from a in dbContext.Animals
              join b in dbContext.ProjectTigers on a.Country equals b.Country
              select new { Country = a.Country, 
                           No = b.No,
                           Lion = a.Lion, 
                           Tiger = a.Tiger }
            ) // We have the join results. Let's group by now
            .GroupBy(f => f.Country, d => d,
            (key, val) => new { Country = key, 
                                No = val.First().No,
                                Lion = val.Sum(s => s.Lion), 
                                Tiger = val.Sum(g => g.Tiger) });

这将为您提供一个匿名对象的集合。如果您有一个视图模型/dt来表示您期望的数据项,那么您可以在这个linq表达式的投影部分中使用它。

此外,就像评论中提到的其他人一样,您可能希望找到一种更好的方法来构建数据库模式。

您仍然可以使用EntityFramework实现它,并且仍然可以使用SQL server的强大功能为您预处理提升。

通过直接与通用方法SqlQuery<>一起使用,这可以非常容易地完成。

创建一个符合您需求的类

public class AnimalsCount
{
    public int No { get; set; }
    public int Lion { get; set; }
    public int Tiger { get; set; }
}

现在使用SqlQuery<AnimalsCount> 的Generic方法

var animalsCount = ctx.Database
                    .SqlQuery<AnimalsCount>("SELECT Country,(SELECT [No] FROM ProjectTiger WHERE Country = a.Country) as [No], sum(lion) as Lion, sum(tiger) as Tiger FROM [Animal] as a GROUP BY Country")
                    .ToList();