我有两个这样的表表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();