2011-07-28 3 views
1

RenderActionから別のビューにnull値を渡そうとしています。しかし、中 ラムダクエリで使用されるNullableパラメータが無視されています

<div id="Global_Backlog_Board" class="Board_Panel"> 
    @{Html.RenderAction("ListOfSingleCards", new 
     { 
      State_ID = 1 
     });} 
</div> 

HomeController.cs

public PartialViewResult ListOfSingleCards(int? Sprint_ID, 
              int State_ID = 1) 
{ 
    var Cards = db.Cards.Where(x => x.State_ID == State_ID && 
            x.Sprint_ID == Sprint_ID && 
            x.Deleted != 1 && 
            x.Archive != 1).ToList(); 
    return PartialView(Cards); 
} 
SprintManager.cshtml

...コントローラで、私のLINQ、ラムダ式が正しく経由するNULL値にもかかわらず、右のフィールドをロードしていない、との

Sprint_IDが渡され、ここではnullとしてロードされていますが、行を正しく読み込むためのクエリを取得できません。

は実際には、次のような作品:

var Cards = db.Cards.Where(x => x.State_ID == State_ID && 
      x.Sprint_ID == null && 
      x.Deleted != 1 && 
      x.Archive != 1).ToList(); 

は、だから私はSprint_IDがnullと2つの別々のクエリのいずれかを実行した結果に応じている場合、私がチェックできると仮定したが、私は理由を理解したいのですが、私の元の試行は機能していません。

ありがとうございました!

+0

多分それは少しオフトピックだか、それもあなたの問題を解決する可能性があります...しかし、あなたはラムダで複数の条件を作るあなたはそれらをすべて一括弧で入れるべきです。 f.ex '.Where(x =>(x.State_ID == State_ID && x.Sprint_ID == null && x.Deleted!= 1 && x.Archive!= 1))... ' – ub1k

+1

次の答えを見てください:http://stackoverflow.com/questions/586097/compare-nullable-types-in-linq-to-sql/586109#586109 –

+0

コメントありがとうございます。私は試してみましたが、私の問題は解決しません。私は自分の括弧の中に条件を入れたことはありません - これを行う理由はありますか?それはちょうど標準ですか? – Robodude

答えて

1

私は正しい答えを知りませんが、あなたのソリューションに基づいて、あなたがそれを整理することができるはずです。

var cards = new List<Card>(); 
var query = db.Cards.Where(x => x.State_ID == State_ID && 
           x.Deleted != 1 && 
           x.Archive != 1); 

if (Sprint_ID.HasValue) 
    query = query.Where(x => x.Sprint_ID == Sprint_ID); 
else 
    query = query.Where(x => x.Sprint_ID == null); 

cards = query.ToList(); 
1

nullable intは、あなたが考えているように "null"を返しません。あなたは価値があるかどうかを決定するためにそれのhasValueはプロパティをチェックする必要があり、そのため、その後はnullを使用し、それ以外の場合を使用する場合:

public PartialViewResult ListOfSingleCards(int? Sprint_ID, 
              int State_ID = 1) 
{ 
    var Cards = db.Cards.Where(x => x.State_ID == State_ID && 
            x.Sprint_ID == Sprint_ID.HasValue ? Sprint_ID.Value : null && 
            x.Deleted != 1 && 
            x.Archive != 1).ToList(); 
    return PartialView(Cards); 
} 
+0

試行:x.Sprint_ID ==(int?)(Sprint_ID.HasValue?Sprint_ID.Value :(int?)null)&&しかし、それでもdbから正しい値が返されません。 : – Robodude

+0

x.Sprint_IDのデータ型は何ですか?nullと3進表現の戻り値を 'int?'にキャストする理由は、比較を完全に変更することになります。 – scwagner

+0

Sprint_IDはintですが、あなたの応答はVisual Studioでコンパイルされません。次のエラーが発生します:エラー:演算子 '=='は 'int型のオペランドには適用できません? 'と'ブール '。 – Robodude

0

より良い何かが長いが来るまで、私はこの使用しています:

var Cards = new List<Card>(); 

if (Sprint_ID == null) 
{ 
    Cards = db.Cards.Where(x => x.State_ID == State_ID && 
           x.Sprint_ID == null && 
           x.Deleted != 1 && 
           x.Archive != 1).ToList(); 
} 
else 
{ 
    Cards = db.Cards.Where(x => x.State_ID == State_ID && 
           x.Sprint_ID == Sprint_ID && 
           x.Deleted != 1 && 
           x.Archive != 1).ToList(); 
} 
関連する問題