2016-07-22 27 views
0

我有两个表这样 表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 

我已经创建inumerable类这样

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查询这些数据从数据库总和以及如何在Razor视图显示此

我可以写在SQL这样的查询,但无法将它到LINQ

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

任何帮助就日将不胜感激。

+1

通用方法,如果你知道如何使用SQL做到这一点,那么我会说只是做到这一点。你会有更多的权力使用sql比linq – Steve

+0

曾听说过数据库规范化? –

+0

是的,但它不是多余的,检查最后一列 –

回答

2

您基本上需要加入两个表格并按国家名称对结果进行分组,然后生成结果。

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) }); 

这会给你一个匿名对象的集合。如果您有一个视图模型/ dto来表示您的预期数据项,那么您可以在此linq表达式的投影部分中使用它。另外,像其他人在评论中提到的那样,您可能希望查看构建数据库模式的更好方法。

+0

你的意思是它会给我动态? 如果你有任何关于数据库模式的建议,请帮忙 –

0

你仍然可以使用EntityFramework实现它,并仍然使用SQL服务器的强大功能为你完成提升。

通过直接使用通用方法SqlQuery<>这可以很容易地完成。

创建一个类,将适合您的需要

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

现在使用的SqlQuery<AnimalsCount>

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();