2012-02-28 8 views
2

私はLinqの初心者ですが、その多くは今は完全に混乱しています。Linq:余分な 'Where'節を追加すると、ランダムな結果が得られます

LinqFlickrライブラリをhttp://linqflickr.codeplex.comからダウンロードして使用しました。しかし、私はLinqについての理解が不足していると思う。 LinqFlickrプロジェクトには私が続けるための多くの文書はありません。

次のコードを実行すると、ユーザー名文字列が空白の場合、正常に実行され、特定のタグ付きの写真が返されます。しかし、ユーザー名があれば、それは特定のユーザーによって以前の結果を精緻化する必要があります。代わりに、私にはランダムな写真がたくさんあります。

  var photos = (from ph in context.Photos 
         where 
         ph.SearchMode == SearchMode.TagsOnly 
         && ph.SearchText == tag 
         && ph.PhotoSize == PhotoSize.Small 
         && ph.Extras == (ExtrasOption.Owner_Name | ExtrasOption.Date_Taken) 
         select ph); 

      if (username != "") 
      { 
       string personId = (from people in context.Peoples 
           where 
           people.Username == username 
           select people.Id).First(); 
       photos = photos.Where(q => q.NsId == personId) ; 
      } 

      photos = photos.Take(10); 

私は、このようなLinqPadやMetaLinqなど、いくつかのデバッグツールを使用してみましたが、私は彼らとそれを解決することができていません。

また、私のLinqクエリは1つのクエリで作成できますが、Linq初心者が理解できるように説明してください。

+3

、 'String.IsNullOrEmpty側の注意点として、(ユーザー名)'ユーザ名 'よりも優れている= ""' – ipavlic

+0

は、string.IsNullOrWhiteSpace(ユーザー名)があります!!!さらに良い。 –

+0

@ipavlic、@ A.R:どうやって?確かにそれはOPが実際にテストしようとしているものに正確に依存します。 (確かに、私はここでニックピッキングしています。ほとんどの場合、IsNullOrEmptyまたはIsNullOrWhiteSpaceが良いオプションになります) – LukeH

答えて

2

あなたのクエリは正常です。私が推測するのは、これはアテーナのバグ(直感的でない設計上の振る舞い)であり、余分な "連鎖"されたwhere句がオリジナルのwhere句を忘れてしまうことでしょう。

2つ目のクエリを個別に組み立てて(つまり、すべての制約を1つの大きなwhere節に組み込みます)、これが修正されることを確認します。そうであれば、間違いなくAPIのバグです。これを回避するには、LINQKitを使用して、where句の述部を動的にアセンブルして展開します。ここでは、これがどのように見えるかです:サイドノートとして

​​
+0

いいえ、私も理解することができます:) しかし、 "And() - 引数は1つのパラメータを取る"と言っています。 – ankles

+0

@ user106565: 'LinqKit.dll'への参照を含めて、追加しましたか?あなたのファイルの先頭に '' LinqKit; 'ディレクティブを使用していますか? – Ani

+0

あなたの助けを嬉しく思います! – ankles

関連する問題