2017-04-26 49 views
0

我看到其中一個ViewModel與一個LINQ查詢填充,如下所示的情形計算出的屬性(列)一個ViewModel。 問題:我怎樣才能填充TotalSale屬性(列) - 即售列總計 - 以下視圖模型嗎? 注意:我正在使用最新版本的ASP.NET Core與VS2015。加載LINQ結果到具有

視圖模型:

public class CategProdViewModel 
{ 
    public string Category { get; set; } 
    public string ProductName { get; set; } 
    public float Sale { get; set; } 
    public float TotalSale { get; set; } 
} 

控制器

var innerJoinQuery = from category in categories 
     join prod in products on category.ID equals prod.CategoryID 
     select new CategProdViewModel { Category = category.Name, ProductName = prod.Name, Sale = prod.Sale }; 
+1

爲什麼不只是建立一個字段值?你期望它如何計算?我在這裏沒有看到任何'數量'屬性。 P.S.這是如何編譯的? C#沒有「真實」關鍵字。你使用羅斯林轉換器或什麼? –

+0

@AlexZhukovskiy我的意思是「浮動」,在遷移過程中被轉換爲SQL Server中的實數。指出後我已更正了錯字(謝謝)。不,我沒有使用任何轉換器。只是簡單的遷移到SQL Server 2012. – nam

+0

好的,但你仍然沒有回答應該如何形成GrandTotal。或者你只是想在所有'CategProdViewModel'對象中複製一個單一的值?這是可能的,但似乎是邏輯上的錯誤。 –

回答

0

你不澄清Product結構,但你可以Sum多個值

var innerJoinQuery = from category in categories 
     join prod in products on category.ID equals prod.CategoryID 
     select new CategProdViewModel { 
      Category = category.Name, 
      ProductName = prod.Name, 
      Sale = prod.Sale, 
      TotalSales = products.Sum(t => t.Sale) 
}; 

沒有關於代碼的更多信息,很難說,而且,prod.sale可能只是最後一個產品的數量。您可以使用Sum(this IEnumerable<TSource> source, Func<TSource, double> selector)來總計多個項目的總和。

這是一個快速的答案。這可能需要根據代碼的其餘部分來改變。您還可以將Group的查詢結果加起來。

+0

您的建議解決方案爲我提供了所需的結果。但是,正如'@ CodingYoshi'在他的建議迴應中所隱含的那樣 - 「TotalSales」列在每一行中都重複(儘管結果正確)。然而,在我的View中的'@ foreach'語句中,我沒有使用'TotalSales'列 - 我只在最後纔用到GrandTotal。所以它工作。現在可能會有一個值得商榷的問題,就是使用你提出的方法還是提供一個'@ CodingYoshi',或者可能有其他一些可能的方法。另外,您根據您提供的信息提供了建議的解決方案。 – nam

+0

是的,它絕對不是一個完整的解決方案。如果我這樣做,我會'分組'並將它們相加。你可能想要這樣做,而不是'foreach'。他們都工作,這主要是偏好。真高興你做到了。 –

+0

我確實必須使用'foreach',因爲我正在爲'@ AlexZhukovskiy'的註釋中所解釋的所選類別(從下拉列表中)選定產品的「每個銷售」顯示一個表格行。 – nam

2

你將有許多這些在你看來:

public class CategProdViewModel 
{ 
    public string Category { get; set; } 
    public string ProductName { get; set; } 
    public float Sale { get; set; } 
    public real TotalSale { get; set; } 
} 

但你只會有最後一個屬性TotalSale一次。因此,將您的視圖模型更改爲:

public class CategProdViewModel 
{ 
    public string Category { get; set; } 
    public string ProductName { get; set; } 
    public float Sale { get; set; } 
} 

爲您的視圖創建此模型並將其傳遞給您的視圖。

public class UseThisOnYourView // Give it another name 
{ 
    public List<CategProdViewModel> Items { get; set; } 
    public real TotalSale { get { return this.Items.Sum(x => x.Sale); } } 
} 

然後將查詢會是這樣:

var innerJoinQuery = from category in categories 
     join prod in products on category.ID equals prod.CategoryID 
     select new CategProdViewModel { Category = category.Name, ProductName = prod.Name, Sale = prod.Sale }; 

var model = new UseThisOnYourView 
      { 
       Items = innerJoinQuery.ToList() 
      }; 

注:請記住,您需要調整您的視角以使用新的類型要傳遞到它,並相應地調整代碼。

+0

謝謝你提供了另一種方法。你的代碼很好,因爲'TotalSale'列在查詢結果中不重複。並且可能會更好地表現明智(儘管有些人可能會爭辯說'sum()'函數迭代會在內部拋出行)。您的代碼也會使您的回覆中的其他讀者受益。 – nam

+0

它必須重複以獲得總和。沒有其他辦法。但是你的模型現在更清潔,而且你不會通過電線傳送太多數據。 – CodingYoshi

+0

我同意你 - 在服務器端完成繁重的工作,並且通過電線發送的數據較少。另外,我已更正了ViewModel上的一個小錯字,您可能也想糾正它 - 我的意思是TotalSale的數據類型在ViewModel中爲「float」。 – nam