2016-04-06 19 views
2

Öğrenme konusunda sıkıntı çekiyorum Linq, insanlar zaten Sql hakkında bir şey bilenleri öğrenmek için pek de zor değil ama hala sorunlarım var, temelde bir harcama yaptığım bir masa var ya da bir kazanç, 2 tarihleri ​​arasında arama yaptığımda zorluk çeken bazı değerler yapmak için istatistik olduğunu biliyorum, bazen aradığımda 2 tarih aradığım zaman sadece bir giderim var ve bir kazanç yok ve sorguda ne olduğu hakkında hiçbir fikri yok yapmalı, bu yüzden seçim içindeki tüm özellikler için nasıl varsayılan değerler koyabilirim?Sorgudaki bir seçenekten varsayılan değer alın

[HttpPost] 
    public ActionResult Index(string dataInicial, string dataFinal) 
    { 
     var userId = User.Identity.GetUserId(); 

     var queryDefault = db.SaldoUtilizadores.Where(d => d.ApplicationUserId == userId) 
    .GroupBy(x => x.ApplicationUserId) 
    .Select(x => new 
    { 
     biggestValor = x.Max(y => y.valor), 
     lowestValor = x.Min(y => y.valor), 
     expenses = x.Where(y => y.valor < 0).Sum(y => y.valor), 
     earnings = x.Where(y => y.valor > 0).Sum(y => y.valor), 
     lowestDate = x.Where(y => y.valor == x.Min(z => z.valor)).Select(y => y.data).FirstOrDefault(), 
     biggestDate = x.Where(y => y.valor == x.Max(z => z.valor)).Select(y => y.data).FirstOrDefault() 
    }).FirstOrDefault(); 

ben zaten çok aranan ve siz i takdir bana yardımcı olabilir bir beton cevabını bulamadık.

Ps: Sorry for my kötü Gruba kimliği dayalı değerleri çalıştığınız ne algılanan senin problemden

+0

talebinizle ilgili sorun nedir? - vs. çalışma zamanı istisnası, yanlış sonuç? –

+0

sorunu tablodaki masrafı içerdiği görünümde 2 tarih seçtiğimde <0, kazanım yok, –

+0

sorgusu içinde gerçekleştiğinde değeri 0 olarak ayarlamak istiyorum x.Where (y => y.valor> 0) .Sum (y => y.valor) 'bunu yapar mı? –

cevap

1

yerine özel Where sonucu boş grubu olduğu zaman, aşağıdaki yapıların birini kullanabilirsiniz oluşturur Where(condition).Sum(selector):

(A) 'Where(condition).Select(selector).DefaultIfEmpty().Sum():

expenses = x.Where(y => y.valor < 0).Select(y => y.valor).DefaultIfEmpty().Sum(), 
earnings = x.Where(y => y.valor > 0).Select(y => y.valor).DefaultIfEmpty().Sum(), 

(B Where(condition).Select(({nullable type})selector).Sum() ?? 0:

expenses = x.Where(y => y.valor < 0).Sum(y => (decimal?)y.valor) ?? 0, 
earnings = x.Where(y => y.valor > 0).Sum(y => (decimal?)y.valor) ?? 0, 

(C) Sum(condition ? selector : 0):

expenses = x.Sum(y => y.valor < 0 ? y.valor : 0), 
earnings = x.Sum(y => y.valor > 0 ? y.valor : 0), 
+0

arasında kazanç yokken sorun oluşuyor. int model mi? ve ondalık ?, ama işe yaramadı: S neden biliyor musun? –

+0

Modeli değiştirmek zorunda değilsiniz, sadece sorgu. İstediğiniz istisnadan 'valor' özelliği 'decimal' olmalıdır, doğru mu? –

+0

, çözümünüzle çözüldü: D, Asp.net: S ile basit şeylerin karmaşık olmasının nedeni şudur –

0

ingilizce.

x.DefaultIfEmpty() öğesini ihtiyacınıza göre kullanabilirsiniz.

+0

kullanmalıyım. Sorgularımı değiştirdim, son 1imi pozlamayı unuttum, sorun yok veya 2 tarih –

0
expenses = ((x.Where(y => y.valor).Sum(y => y.valor))==null ||(x.Where(y =>y.valor).Sum(y => y.valor))<0)?0:x.Where(y => y.valor).Sum(y => y.valor)