2016-03-29 1 views
3

Nun, ich sendet dieses einen neuen Ansatz versuchen und tun will:Linq eine Liste in einem Modal und den Wert

Modell Gleichgewicht

public class Balance 
{ 
    public Balance() 
    { 
     Expenses = new List<Expenses>(); 
     Earning = new List<Earnings>(); 
     value = 0; 
    } 

    public int BalanceId { get; set; } 
    public virtual List<Expense> Expenses { get; set; } 
    public virtual List<Earning> Earnings { get; set; } 
    public string ApplicationUserId { get; set; } 

    public decimal value { get; set; } 
} 

ich dieses Modell, und ich wollte weiß, ob es möglich ist, eine Abfrage in Linq zu machen, um alle Werte aus der Liste der Ausgaben und Einnahmen zu addieren, und wie kann ich das tun, brauche ich diesen Ansatz in meinem Programm jetzt, mache ich die Schleifen in der Ansicht so :

Controller

public PartialViewResult _ObtemSaldo() 
    { 
     var userId = User.Identity.GetUserId(); 
     var balance = db.Balance.Where(d => d.ApplicationUserId == userId).FirstOrDefault(); 
     return PartialView(balance); 
    } 

Ansicht

@model MSDiary.Models.Balance 



@helper getBalance() 
{ 
decimal balance = 0; 
int id = Model.BalanceId; 
if (Model != null) 
{ 
    foreach (var item in Model.Despesas) 
    { 
     balance-= item.ExpenseValue; 
    } 
    foreach (var item in Model.Rendimentos) 
    { 
     balance += item.EarningValue; 
    } 
    Model.value = balance; 
    if(balance < 0) 
    { 
     ViewBag.color = "red"; 
       <p style="color:red">@saldo</p> 
      } 
    else 
    { 
     ViewBag.color = "green"; 
       <p style="color:green">@saldo</p> 
    } 
} 

} 

<h3>Actual balance: <span>@getBalance()</span></h3> 

Ich möchte wissen, ob ich versuche, denke auch das Konzept zu ändern, und wie kann ich die Linq-Abfrage tun, um zu bekommen, was ich brauche

Ps: Entschuldigung für mein schlechtes Englisch

+3

In der Steuerung, balance .value = balance.Earnings.Sum (x => x.EarningValue) - balance.Expenses.Sum (x => x.ExpenseValue); ' –

Antwort

0

Obwohl der Code in Ordnung ist, aber ich Geschäft bewegen würde Logik zur Serverseite stattdessen. Wir können dort Helfer (Erweiterung) -Methode erstellen. Lassen Sie uns LINQ (als Stephen Muecke vorgeschlagen):

public static class BalanceHelper 
{ 
    public static Balance GetBalance(this Balance balance) 
    { 
     if(balance != null) 
     {   
     balance.value = balance.Earnings.Sum(x => x.EarningValue) - 
          balance.Expenses.Sum(x => x.ExpenseValue); 
     } 

     return balance; 
    } 
} 

Und Sie können es in der Steuerung verwenden, nachdem Namespace hinzugefügt, die es enthält:

using MyProj.Core.MyHelpers; // namespace with BalanceHelper class 

public PartialViewResult _ObtemSaldo() 
{ 
    var userId = User.Identity.GetUserId(); 
    var balance = db.Balance.Where(d => 
      d.ApplicationUserId == userId) 
        .FirstOrDefault() 
        .GetBalance(); // boom 

    return PartialView(balance); 
} 

Und in Sicht können wir UI Operationen ausführen:

@helper highlightBalance() 
{ 
    if(Model.value < 0) 
    { 
     ViewBag.color = "red"; 
        <p style="color:red">@saldo</p> 
    } 
    else 
    { 
     ViewBag.color = "green"; 
       <p style="color:green">@saldo</p> 
    } 
} 

<h3>Actual balance: <span>@highlightBalance()</span></h3> 
+0

Ihre Vorgehensweise ist wirklich gut, ich habe mich geändert mein Code und versuchte zu lösen Bevor ich auf andere Weise hierher kam, benutzte ich im Grunde die Schleifen, die ich in der Ansicht im Controller gemacht habe und dann den Wert an die Ansicht sendete, den Wert in der Datenbank im Controller speicherend, was denkst du? –

+0

@FilipeCosta Imho ist es absolut normal, Schleifen anstelle von LINQ zu verwenden, aber es ist 'schmutzige Praxis', die Ansicht zu verwenden, um Dinge zu berechnen oder eine Geschäftslogik am Modell auszuführen. Normalerweise sollte dies in der Core-Bibliothek geschehen, in einigen Fällen geschieht dies im Controller, aber nicht in der View. – Fabjan

+0

Das war genau der Grund, warum ich meinen Ansatz geändert habe, danke ist gelöst :) –

0

implementieren value als eine Getter-only-Eigenschaft, becau se-Code, der etwas berechnet nicht in der Ansicht gehören:

public decimal value => Earnings.Sum(e => e.EarningValue) - Expenses.Sum(e => e.ExpenseValue); 

Wenn Sie mit C# nicht 6, tun es auf diese Weise:

public decimal value { get { return Earnings.Sum(e => e.EarningValue) - Expenses.Sum(e => e.ExpenseValue); } }