2011-10-24 19 views
1

モデルはPersonの0,1または2のContactのモデルです。
連絡先情報(contact_typeは "h")、連絡先情報(contact_typeは "w")。nullを選択しないようにする文を選択

contact_type == "h"Contactオブジェクトが通り名を選択する際に存在することを確認する方法はありますか? Contactオブジェクトが存在しない場合、今はnull例外が発生します。

from m in persons 
select new 
{ 
    Id = m.id, 
    Name = m.surname, 
    Address = m.Contacts.Where(c => c.contact_type == "H").SingleOrDefault().streetname 
}; 

答えて

3

方法について:

var rows = from m in persons 
    let h = m.Contacts.Where(c => c.contact_type == "H").SingleOrDefault() 
    select new { 
     Id = m.id, 
     Name = m.surname, 
     Address = (h == null ? null : h.streetname) 
    }; 

か:

var rows = from m in persons 
    select new { 
     Id = m.id, 
     Name = m.surname, 
     Address = m.Contacts.Where(c => c.contact_type == "H") 
       .Select(c => c.streetname).SingleOrDefault() 
    }; 

も(おそらくより明確に)書くことができ:

var rows = from m in persons 
    select new { 
     Id = m.id, 
     Name = m.surname, 
     Address = (from c in m.Contacts 
        where c.contact_type == "H" 
        select c.streetname).SingleOrDefault() 
    }; 
+0

私は第2のものが好きです。おかげで一束=) – Niklas

0

あなたが持つことができるmulitple Where節:

Address = m.Where(person => person.Contacts != null).Contacts.Where(... 
+0

これは、 'Contacts'がヌルであるかどうかをチェックするだけです。 'H'-contactが存在するかどうかをチェックしない。 –

+0

@MarcGravell彼は複数のwhere節を組み合わせる。最初の1つは空のコンタクトをフィルタリングし、2番目のコンタクトはコンタクトタイプ –

+0

@Wouterはいをフィルタリングしますが、問題は(私が読んでいるように)Hコンタクトがないと失敗することです。上記のものは、 '.streetname'の最終的な取得に何かが行われない限り、まだ失敗します。 –

関連する問題