2016-07-22 46 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();