-1

LINQ-to-objects を使用して、数レベルの深さのオブジェクトのコレクションをクエリし、値を抽出したいと考えています。たとえば、Entity オブジェクトが与えられた場合、フラグが 1 に設定されている場合は emailAddress 文字列を取得し、それ以外の場合は null を取得します。

 Entity.CommunicationCollection.Communication.CommunicationDetail.EmailAddress

CommunicationDetail は次のようになります。

 public class CommunicationDetail
 {
     public int Flag;
     public string EmailAddress;
 }

私が思いついたクエリは次のようになります。

 string email = Entity.CommunicationCollection.FirstOrDefault(x => x.Communication.CommunicationDetail.Flag == 1).EmailAddress;

これの問題は、階層内の null オブジェクトによって null ref 例外が発生することです。最初にすべてのオブジェクトをチェックせずに、何らかの方法でヌルを無視するようにクエリを構成する方法はありますか? (上記は単純化された例です。私が取り組んでいるプロジェクトのネストはもっと深いものです。)

4

2 に答える 2

3

まあ、すべてをチェックするか??、デフォルト設定に使用する必要がありますが、それでも厄介です。次のようなものが必要だと思います:

var email = Entity.CommunicationCollection
                  .Where(x => x.Communication != null &&
                              x.Communication.CommunicationDetail != null &&
                              x.Communication.CommunicationDetail.Flag == 1)
                  .Select(x => x.Communication.CommunicationDetail.EmailAddress)
                  .FirstOrDefault();

emailまだここにある可能性があることに注意してnullください...

明らかに、null にならない場合x.Communication、または null になれないx.Communication.CommunicationDetail場合は、これらのチェックを削除できます。モデルで何が null になるかは明確ではありません。

于 2013-02-05T14:46:56.933 に答える
1

IsNull や IsNotNull などと呼ばれる汎用メソッドを使用してクラスを作成し、任意のオブジェクト型を取り、オブジェクトをチェックして null かどうかを確認することを強くお勧めします。これにより、クエリしているオブジェクトごとに個別の検証を行う必要がなくなります

public class NullChecker where T : class
{
    public static bool IsNotNull<T>(default(T) type)
    {
        return type != null;
    }
}
于 2013-02-05T14:47:02.743 に答える