2016-12-12 2 views
1

にnullを与えます:が列を合計すると、私は列の合計を計算し、次のSQL文を持っているC#/ ASP.NET

enter image description here

select coalesce(SUM(cdin_ActMortgageAmnt),0) 
from CDIndex,company 
where comp_companyid=cdin_companyid and comp_idcust like '%10319%' 
and cdin_Deleted is null and cdin_startunstufdate is not null 
and cdin_Status='InProgress' 

は私にこのような出力を提供します

私はこのようにLINQに変換しようとした:

var sumation = (from com in db.Companies 
       join cd in db.CDIndexes on com.Comp_CompanyId equals cd.cdin_CompanyId 
       where 
        cd.cdin_Status == "InProgress" && 
        cd.cdin_startunstufdate == null && 
        cd.cdin_Deleted == null 
       select new { 
        sum = cd.cdin_ActMortgageAmnt 
       } 
       ); 

var summ = sumation.Sum(x => x.sum); 

を私はトレースポイントがあること置くとき私はそれを指すとき、それは私にnullを与えるデバッグモードで側の変数summ

何が問題ですか?

+0

あなたが「指している」ときは、 'var summ ...'がアクティブな行を表示しているのですか、 '' null'を見たときにすでにそれを乗り越えていますか? –

+0

[NullReferenceExceptionとは何か、それを修正するにはどうすればいいですか?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) ) –

+0

@KennethK。私はexcactly何を押す(F5)、トレースポイントが黄色の矢印に変わるので、デバッガが 'var summ 'を押すので、(F11)を押して1行進み、次に' var summ'をポイントしてsumm | null –

答えて

0

このクエリは、SQLクエリが適切であるやるとき

 var sumation =db.Companies.Join(db.CDIndexes, 
             com=>com.Comp_CompanyId, 
             cd=>cd.cdin_companyid, 
             (com,cd)=>new {com,cd}) 
            .Where(x=>x.com.comp_idcust.Contains("10319") && x.cd.cdin_Status== "InProgress" && 
              cd.cdin_startunstufdate != null && 
              cd.cdin_Deleted == null) 
            .Select(x=>new 
            { 
             sum=x.cd.cdin_ActMortgageAmnt ?? 0 
            }).ToList() 
+0

閉じるが、 'com => com.Comp_CompanyId、cd => cd.cdin_companyid、'、 '.ToList()'は必要ありません。 –

+0

@RobertMcKeeどうしたのですか? – Eldeniz

+0

'cd => cd.cdin_companyid、com => com.Comp_CompanyId、'(内部キー選択、外部キー) –

2

cdin_ActMortgageAmntの一部の値がnullになり、デフォルト値0を指定しているため、最終的なクエリで同じことを行う必要があるため、coalesce(SUM(cdin_ActMortgageAmnt)、0)を使用しています。このような何かあなたが

cd.cdin_ActMortgageAmnt ?? 0 

選択
+0

'選択新しい {cddd = cd.cdin_ActMortgageAmnt == NULL 0:cd.cdin_ActMortgageAmnt };' これはNULL値の問題を解決しますか? –

+0

この場合、cdin_ActMortgageAmntのデフォルト値が得られます。この場合は、0または大文字と小文字の区別があります。あなたがまだnullを得ているのは、データが指定した基準を満たさないためです。同様のステートメントはContains comp_idcust.Contains( "10319")を使用して翻訳する必要があります。 – Zinov

+1

和は問題ではありません。なぜなら、Sumはnull値を無視するだけなので、NULLを0に変換する必要はありません予め。問題は、SQLのように!= nullの代わりにdin_startunstufdate == nullを探しているクエリです。 –

0

はここに1つの方法です:

var summ = db.Companies.Join(
    db.CDIndexes, 
    cd => cd.cdin_CompanyId, 
    com => Comp_CompanyId, 
    (com, cd) => new { com, cd }) 
    .Where(z=>z.com.comp_idcust.Contains("10319")) // Added "LIKE" 
    .Where(z=>z.cd.cdin_Status == "InProgress") 
    .Where(z=>z.cd.cdin_startunstufdate != null) // Reversed your condition 
    .Where(z=>z.cd.cdin_Deleted == null) 
    .Sum(z=>z.cd.cdin_ActMortgageAmnt); 

あなたはまた、一緒にすべてのwheresを組み合わせることができ、しかし、私はこのようなほとんどの場合に好きではない:

var summ = db.Companies.Join(
    db.CDIndexes, 
    cd => cd.cdin_CompanyId, 
    com => Comp_CompanyId, 
    (com, cd) => new { com, cd }) 
    .Where(z=>z.com.comp_idcust.Contains("10319") // Added "LIKE" 
    && z.cd.cdin_Status == "InProgress" 
    && z.cd.cdin_startunstufdate != null // Reversed your condition 
    && z.cd.cdin_Deleted == null) 
    .Sum(z=>z.cd.cdin_ActMortgageAmnt); 
+0

また、企業はCDIndexesあなたのモデルでは、このクエリは非常に簡単になります。 –

関連する問題