2016-04-06 18 views
2

私はちょっとSqlに関する何かを知っている人を学ぶのは難しいと言っていますが、まだ問題があります。基本的に私は支出があるテーブルを持っていますまたは収益、私は2つの日付の間に検索するときにトラブルがある統計情報を行うためにいくつかの値私はそれが起こることを知っているときに2つの日付の間に検索するときに私はちょうど経費と収益ではないと、どのように私は選択内のすべての属性のデフォルト値を置くことができますか?クエリのselectからデフォルト値を取得

[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(); 

すでに多くの検索が行われていますが、あなたが私に感謝してくれたら、具体的な回答が見つかりませんでした。

シモンズ:あなたの問題から

+0

クエリでの問題は何である - などの実行時例外、誤った結果、? –

+0

問題は、テーブル内の経費を含むビュー内で2つの日付を選択したときに発生します。なぜなら、収益は存在しません。クエリ内で発生したときに値を0に設定したいからです。 –

+0

' x.Where(y => y.valor> 0).Sum(y => y.valor) 'これを行う? –

答えて

1

代わりの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

モデルをintに変換する?小数点は?、それは動作しませんでした:Sあなたはなぜ知っていますか? –

+0

モデルのみを変更する必要はなく、クエリのみを変更できます。あなたが掲示した例外から、 'valor'プロパティは' decimal'でなければなりません、そうですか? –

+0

あなたの解決策で解決しました:Dはなぜ簡単なことがAsp.net:S –

0

私の悪い英語のため申し訳ありませんが、私が感知したものを使用して、グループにユーザーIDに基づいて値をしようとしているということです。

必要に応じてx.DefaultIfEmpty()を使用できます。

Whereの結果が空集合である場合、次の構築物のいずれかを使用することができる例外を生成
+0

私のクエリを変更しました。最後の1つを投稿するのを忘れました。問題は2つの日付の間に費用がかかっていない場合に発生します。 –

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) 
関連する問題