4

MSDNの記事「方法:左外部結合の実行(C#プログラミングガイド)」にある手法を使用して、Linqコードで左外部結合を作成しようとしました。この記事ではDefaultIfEmpty、グループ結合から左外部結合を作成するためのメソッドの使用について説明しています。基本的には、右側のコレクションに結果がない場合でも、左側(最初)のコレクションの結果を含めるようにプログラムに指示します。

ただし、このプログラムの実行方法は、外部結合が指定されていないかのように実行されます。

私たちのデータベースにAgentProductTrainingは、エージェントが受講したコースのコレクションがあります。Course通常、対応する値をテーブルに入力せずに、適切なテーブルにを入力することはできませんCourseMaterials。ただし、これが発生する場合があるため、に対応する情報がない状態でaCourseがリストされている場合でも、必ず結果を返すようにします。AgentProductTrainingCourseMaterials

var training = from a in db.AgentProductTraining
    join m in db.CourseMaterials on a.CourseCode equals m.CourseCode into apm
    where
        a.SymNumber == id 
        from m in apm.DefaultIfEmpty()
        where m.EffectiveDate <= a.DateTaken
        && ((m.TerminationDate > a.DateTaken) | (m.TerminationDate == null))
            select new
            {
                a.AgentProdTrainId,
                a.CourseCode,
                a.Course.CourseDescription,
                a.Course.Partner,
                a.DateTaken,
                a.DateExpired,
                a.LastChangeOperator,
                a.LastChangeDate,
                a.ProductCode,
                a.Product.ProductDescription,
                m.MaterialId,
                m.Description,
                a.Method
            };
4

1 に答える 1

3

MSDNの例では、新しい変数を使用していますsubpet

var query = from person in people
                    join pet in pets on person equals pet.Owner into gj
                    from subpet in gj.DefaultIfEmpty()
                    select new { person.FirstName, PetName = (subpet == null ? String.Empty : subpet.Name) };

したがって、独自の「サブペット」を使用する必要があります。submat変数を使用してコードを書き直しました。

        var training = from a in db.AgentProductTraining
                       join m in db.CourseMaterials on a.CourseCode equals m.CourseCode into apm
                       where
                           a.SymNumber == id
                           from submat in apm.DefaultIfEmpty()
                           where 
                           (submat.EffectiveDate <= a.DateTaken || submat.EffectiveDate == null) &&
                           (submat.TerminationDate > a.DateTaken || submat.TerminationDate == null)
                       select new
                                  {
                                      a.AgentProdTrainId,
                                      a.CourseCode,
                                      a.Course.CourseDescription,
                                      a.Course.Partner,
                                      a.DateTaken,
                                      a.DateExpired,
                                      a.LastChangeOperator,
                                      a.LastChangeDate,
                                      a.ProductCode,
                                      a.Product.ProductDescription,
                                      MaterialId = (submat==null?-1:submat.MaterialId),
                                      Description = (submat==null?String.Empty:submat.Description),
                                      a.Method
                                  };
于 2013-02-19T19:17:01.900 に答える