2009-07-10 18 views
2

私は(主に私がhereを受けたヘルプから来た)私が使用している次のクエリを持っている:はなぜオブジェクトへの私のLINQクエリ結果を返しませんか?

public IEnumerable<Entities.AuditAgency> GetAuditRuleAgencyRecords(IEnumerable<Entities.AuditRuleEnterprise> rules) 
    { 
     using (LinqModelDataContext db = new LinqModelDataContext()) 
     { 
      // Left-Outer Joins on Agency and its various other tables. 
      var auditAgencyRecords = (from ag in db.Agencies 
             join ara in db.AuditRuleAccounts on ag.Agency_Id equals ara.AgencyID into aran 
             from ara in aran.DefaultIfEmpty() 
             join arr in db.AuditRuleResults on ara.AuditRuleAccountID equals arr.AuditRuleAccountID into arrn 
             from arr in arrn.DefaultIfEmpty() 
             join are in db.AuditRuleEnterprises on arr.AuditRuleEnterpriseID equals are.AuditRuleEnterpriseID into aren 
             from are in aren.DefaultIfEmpty() 
             select new 
             { 

              AgencyID = ag.Agency_Id, 
              AgencyName = ag.Agency_Name, 
              AuditRuleEnterpriseID = arr.AuditRuleEnterpriseID, 
              AuditRuleEnterpriseName = are.OverrideDisplayName, 
              CorrectedDate = arr.CorrectedDate, 
              NbrDaysToCorrect = arr.NbrDaysToCorrect, 

             }); 

      IEnumerable<AuditAgency> AuditAgencies = auditAgencyRecords 
       .GroupBy(a => a.AgencyID) 
       .Select(ag => new AuditAgency() 
       { 
        AgencyID = ag.Key, 
        AgencyName = ag.First().AgencyName, 
        Rules = ag 
        .GroupBy(agr => agr.AuditRuleEnterpriseID) 
     // ---->   Do a left outer join on parameter "rules" object and the returned group above 
     // ---->   on both of their ID's 
        .Select(agrg => new AuditAgencyRule() // Now I would like to only be creating "rules" for the rules with IDs that match the rules passed into this method 
        { 
         AuditRuleID = agrg.Key, 
         AuditRuleName = agrg.First().AuditRuleEnterpriseName, 
         Days = (Int32)agrg.Average(agrgr => agrgr.NbrDaysToCorrect) 
        }) 
       }).ToList(); 

      return AuditAgencies; 

     } 

これは私AuditAgencyオブジェクトのリストを返し、各AuditAgencyはAuditAgencyRulesのリストが含まれています。

今..です私の最後のこのクエリのステップ、と私はトラブルを抱えている一部として、あなたはIEnumerableを規則は、このメソッドにパラメータとして渡されることがわかります。それは、各機関のためのルールのリストを作成し、そこに私の2番目のクエリで、私は左の外側をしたいされて私は何をしたい、

は私の地元の「ルール」オブジェクトに参加します。私が渡している各ルールオブジェクトにはルールがあります.ID。私は、各代理店に渡されたルールだけを格納したいと思います。データがない場合は、その内容をそのままにしておきます。

は今のところ、私のクエリは、データベースとそのデータから返されたすべてのルールが含まれています。ただし、データベースから返されるルールと一致するかどうかにかかわらず、メソッドに渡されるルールのみを格納する必要があります。言い換えれば、私は今そこにあるルールを使って、ローカルの "ルール"オブジェクトに対して左外部結合を行う必要があります。私は私がやろうとしている場所と内容を説明するために上記のコードにコメントを追加しましたところ

あなたが見ることができます。

したがって、「ルール」にIDが設定された3つのルールしか含まれていない場合、これらのルールのデータがあるかどうかにかかわらず、このクエリは3つのルールを返すことになります。各代理店のすべての規則を返すのではなく、それが現在のことです。

は、どのように私はこの左外側にはSQLクエリに私のLINQに「ローカル」オブジェクトに対して参加書くのですか?

foreach (var agency in AuditAgencies) 
{ 
    agency.Rules = from rule in rules 
        join lr in agency.Rules on rule.EnterpriseID equals lr.AuditRuleID into g 
        from lr in g.DefaultIfEmpty() 
        select new AuditAgencyRule 
        { 
         AuditRuleID = rule.EnterpriseID, 
         AuditRuleName = rule.Name, 
         Days = lr.Days, 
         Flagged = lr.Flagged, 
         PercentFlagged = lr.PercentFlagged 
        }; 
} 

ませんサイコロ:ここ


は私が私の「ルール」オブジェクトを左外部結合を行うに私の試みと上記、第2のクエリの後に私のAuditAgenciesのルールです。さて、すべてのルールの代わりに、私は〜ないルールを得ています。私が望むのは、このメソッドに渡すルールを取得することだけです。

誰かが正しい方向に向かうことができますか?

答えて

0

基本的に、他のLinqソースと同じ方法で、ローカルオブジェクトとの左外部結合を行います。プロバイダーがあなたがしていることを理解できないときに問題が発生します。

だから、それがうまくいっているかどうかは分かりますか?それがうまくいかない場合は、結果を返すだけで3番目のLinqステートメントで望ましくないルールを除外することが妥当であるかもしれません。

+0

ローカルクエリとSQLクエリを混在させることができませんでした。また、結果をフィルタリングするだけではなく、左外部が必要なので、データベースから返されたルールのエントリ/データがあるかどうかにかかわらず、渡されるもののルールエントリがあることを確認します。 。私は何か正しいことをしていない。地獄、私は正確にどこに参加するか分からない。 – KingNestor

0

それは特に、あなたはすぐにあなたが.ToArrayような何かに滑り試すことができます確認するために、被写体にCharlie Calvert's blogをチェックしてください> ... IEnumeratable <を使用して検討し、まだ戻っていない繰延クエリに起因する可能性があり()割り当てによって、クエリがすぐに実行されます。

1

私はあなたに少しのメタ情報を提供することができます。 LINQPadを取得して、どこに間違っているのかを見るために.Dump()を使い始めるべきです(直接SQLの翻訳も見てください)。

関連する問題