2016-03-29 9 views
3

değeri göndermek:Linq bir Modal bir liste ve Eh ben yeni bir yaklaşım çalışıyor ve bunu yapmak istiyor am

Modeli Dengesi

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

ben bu modeli var ve ben istediğim Linq'de tüm değerleri Tahsilat ve Kazançlar listesinden toplamak için bir sorgulama yapılıp yapılamayacağını biliyor ve bunu nasıl yapabilirim, şu anda programımda bu yaklaşıma ihtiyacım var, bu şekilde görünüşte döngüler yapıyorum :

Kontrolör

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

Görünüm

@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> 

Ben yaklaşım değiştirmeye çalışmak iyi düşünüyorum olmadığını bilmek istiyorum ve nasıl i gerekenleri almak için linq sorgusu yapabilir

Ps: Üzgünüz için üzgünüm

+3

Denetleyicide, "balance .value = balance.Earnings.Sum (x => x.EarningValue) - balance.Expenses.Sum (x => x.ExpenseValue);" –

cevap

0

rağmen ben iş hareket ediyorum:

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

C# 6 kullanmıyorsanız, bu şekilde yapmak bunun yerine sunucu tarafına mantık. Orada yardımcı (uzatma) yöntemi oluşturabiliriz.

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

Ve İçerdiği ad ekledikten sonra denetleyicisi onu kullanabilirsiniz: (Stephen Muecke önerdiği gibi) en LINQ kullanalım

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

Ve görünümünde yapabileceğimiz UI işlemleri:

@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

Yaklaşımınız gerçekten çok iyi, değiştim kodum ve solvayı denedim Başka bir şekilde buraya gelmeden önce, temelde ben denetleyicide görünümünde yaptıkları döngüler kullandım ve sonra değeri denetleyicideki veritabanına kaydetmek için, görünümüne göndermek, ne düşünüyorsun? –

+0

@FilipeCosta Imho, LINQ yerine döngüler kullanmak kesinlikle normaldir, ancak işleri hesaplamak veya bazı iş mantığını modele uygulamak için 'kirli uygulama' kullanmaktır. Normalde bu, Core kütüphanesinde yapılmalıdır, bazı durumlarda kontrolörde yapılır, ancak görünümde değildir. – Fabjan

+0

Tam olarak benim yaklaşımımı değiştirdiğim nedeni oldu, teşekkürler çözüldü :) –

0

value 'u sadece bir alıcı olarak kullan, becau görünümünde ait olmayan bir şey hesaplar se kodu: kod Tamam ama

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