2012-02-18 4 views
1

私は左をperfomしようとしていますLinqを使用して左外部結合を実行している間に不正確な結果を得る理由 - なぜですか?

public class Person 
    { 
     // Properties 
     public string Name { get; set; } 
     public string Area { get; set; } 
     public string Gender { get; set; } 
     public int Age { get; set; } 

     public List<Person> GetPersonData() 
     { 
      List<Person> personLst = new List<Person> { 
      new Person { Name="Shashidhar Niketani", Age=20, Gender="Male" , Area = "Assam"}, 
      new Person { Name="Ahmed Ali Khan", Age=25 ,Gender="Male", Area = "Assam" }, 
      new Person { Name="S. Mirja", Age=20, Gender="Female", Area = "Assam"}, 
      new Person { Name="Neru Kumar", Age=18, Gender="Female", Area = "Colombo"}, 
      new Person { Name="Chidam P", Age=19, Gender="Male", Area = "Colombo"}, 
      new Person { Name="H Kontala", Age=19, Gender="Male", Area = "Bombay"}, 
      new Person { Name="Priya Pankhraj", Age=23, Gender="Female", Area = "North Punjab"}, 
      new Person { Name="Ambla", Age=20, Gender="Female", Area = "Madras"}, 
      new Person { Name="H Kontala", Age=25, Gender="Male", Area = "Bombay"}, 
      new Person { Name="Sirisha Chalukuri", Age=30, Gender="Female", Area = "Bombay"}}; 
      return personLst; 
     } 

     public override string ToString() 
     { 
      return string.Format("Patient Name: = {0} , Age:= {1}, Gender:= {2}, Area: = {3}", Name, Age, Gender, Area); 
     } 

    } 

    public class Hobbies 
    { 
     public string Owner { get; set; } 
     public string HobbyName { get; set; } 

     public List<Hobbies> GetHobbies() 
     { 
      List<Hobbies> hobbyList = new List<Hobbies> { 
      new Hobbies { Owner="Sirisha Chalukuri", HobbyName = "Singing"}, 
      new Hobbies { Owner="Priya Pankhraj", HobbyName = "Cooking" }, 
      new Hobbies { Owner="S. Mirja", HobbyName="Playing"}, 
      new Hobbies { Owner="Neru Kumar", HobbyName="Programing"}}; 
      return hobbyList; 
     } 
    } 

の下

//参加

var res8 = (from person in personSource      
         join hobby in hobbySource 
         on p.Name equals hobby.Owner into temp 
         from hobby in temp.DefaultIfEmpty() 
         select new 
          { 
           PersonName = p.Name, 
           PersonAge = p.Age, 
           Gender = p.Gender, 
           LivesIn = p.Area, 
           Hobby = (hobby == null) ? "N/A" : hobby.HobbyName 
          }); 

しかし、それらのレコードに

Person p = new Person(); 
var personSource = p.GetPersonData(); 

Hobbies h = new Hobbies(); 
var hobbySource = h.GetHobbies(); 

//左外側をフェッチ

に参加してい私は正しい結果を得ることができません...すべてのレコードはnull/nとして来ています一致するレコードには少なくとも4つの一致するレコードがあり、残りのレコードには一致しないレコードがあります。

私は、これらの2つのデータソースを使用して、 PersonNameとHobbyOwnerについて

ヘルプはあなたの選択の投影でhobby.HobbyNameを参照すると、人(DefaultIfEmpty空の趣味のコレクションのためにnullを返します)に該当趣味がない場合、趣味がnull

+0

あなたのpは何を表していますか? – Turbot

答えて

1

を必要としていました。趣味がnullであるかどうかを確認し、そうであれば選択投影のHobbyプロパティをデフォルト値に割り当てます。たとえば、次のように

select new 
{ 
    PersonName = p.Name, 
    PersonAge = p.Age, 
    Gender = p.Gender, 
    LivesIn = p.Area, 
    Hobby = (hobby == null) ? "N/A" : hobby.HobbyName 
}); 

また、それはタイプミスだった場合は知っているが、あなたは人を使用しなければならないとき、あなたのクエリで、あなたは、pを使用しないでください。

var res8 = (from person in personSource      
     join hobby in hobbySource 
     on person.Name equals hobby.Owner into temp 
     from hobby in temp.DefaultIfEmpty() 
     select new 
     { 
     PersonName = person.Name, 
     PersonAge = person.Age, 
     Gender = person.Gender, 
     LivesIn = person.Area, 
     Hobby = (hobby == null) ? "N/A" : hobby.HobbyName 
     }); 
+0

さて、エラーは消えてしまったのですが、私は正しい結果を得ていません。少なくとも4つの一致するレコードがありますが、すべてがヌルレコードとして来ています...クエリーでも助けてください。 – user1025901

0

定義では、左の外側には意志に参加一致するレコードが正しいコレクションに存在するかどうかにかかわらず、最初のコレクションからすべてのレコードをフェッチします。私はそれを動作させるためにあなたのコードで行うために必要な唯一のものは、あなたの最後のブロックにpersonpのすべての発生を変更する(そして唯一のあなたです

var res8 = (from person in personSource      
         join hobby in hobbySource 
         on p.Name equals hobby.Owner into temp 
         from hobby in temp.DefaultIfEmpty() 
         select new 
          { 
           PersonName = p.Name, 
           PersonAge = p.Age, 
           Gender = p.Gender, 
           LivesIn = p.Area, 
           Hobby = hobby == null ? null : hobby.HobbyName 
          }); 
+0

今、エラーが消えました。 ..しかし、私は正しい結果を得ていません。少なくとも4つの一致するレコードがありますが、すべてnullレコードとして来ています...クエリでも助けてください。 – user1025901

+0

@thedugasと@DarkTygurが正しく指摘しているので、 'p'ではなく' person' – user347805

0

:私はあなたが探しているものだと思い

があります私がコピーされた最後のブロック、修正、および以下の貼り付け):

var res8 = (from person in personSource 
        join hobby in hobbySource 
        on person.Name equals hobby.Owner into temp 
        from hobby in temp.DefaultIfEmpty() 
        select new { 
         PersonName = person.Name, 
         PersonAge = person.Age, 
         Gender = person.Gender, 
         LivesIn = person.Area, 
         Hobby = (hobby == null) ? "N/A" : hobby.HobbyName 
        }); 

また、私はこのコードは、あなたの実際のコードにどの程度似て知りませんが、あなたのGetPersonData()とGetHobbies()関数が作ります静的メソッドとしての感覚。そうすれば、あなたのリストを取得するだけで、人や趣味の無駄なインスタンスを作成する必要はありません。それはそのように見えるpそこに人のインスタンスがあなたを捨てた。

関連する問題