2009-07-10 7 views
2

다음 쿼리를 사용하고 있습니다 (주로 here을받은 도움말에서 왔습니다).내 LINQ to 개체 쿼리가 결과를 반환하지 않는 이유는 무엇입니까?

 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 규칙이이 메서드의 매개 변수로 전달된다는 것을 알 수 있습니다.

내가 뭘하고 싶은지, 두 번째 쿼리 거기에, 그것은 각 기관에 대한 규칙의 목록을 만드는, 내 로컬 "규칙"개체에 대한 왼쪽 외부 조인하고 싶습니다. 전달중인 각 규칙 객체에는 규칙이 있습니다 .ID. 각 기관에 전달 된 규칙 만 포함하고 싶으면 해당 기관에 대한 데이터가없는 경우 해당 내용을 null로 두십시오.

지금 내 쿼리에는 데이터베이스에서 반환 된 모든 규칙과 해당 데이터가 들어 있습니다. 그러나 데이터베이스에서 반환하는 규칙과 일치하는지 여부에 관계없이 메서드에 전달 된 규칙 만 포함해야합니다. 다시 말해, 로컬 규칙에 대한 왼쪽 외부 조인을 규칙에 적용해야합니다.

위 코드에 주석을 추가 한 위치를 볼 수 있습니다.

따라서 "규칙"에 ID가 설정된 규칙이 3 개만있는 경우이 쿼리는 해당 규칙에 대한 데이터가 있는지 여부에 관계없이 각 대행사에 대해 해당 3 개의 규칙 만 반환합니다 (해당 데이터는 null입니다). 각 기관에 대한 모든 규칙을 반환하는 것이 아니라 지금하는 일입니다.

LINQ to SQL 쿼리의 "로컬"개체에 대해이 왼쪽 외부 조인은 어떻게 작성합니까?


위의 두 번째 쿼리 후에 내 "규칙"개체와 내 AuditAgencies의 규칙에 대한 왼쪽 외부 조인을 시도합니다.

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 
        }; 
} 

주사위가 없습니다. 자, 모든 규칙 대신, 나는 ~ ~ 규칙을 얻고 있습니다. 내가 원하는 것은 내가이 방법으로 통과하는 규칙을 얻는 것이다.

누군가 올바른 방향으로 나를 가리킬 수 있습니까?

답변

0

기본적으로 다른 모든 Linq 소스와 동일한 방법으로 로컬 객체와 왼쪽 외부 조인을 수행합니다. 공급자가 당신이하고있는 것을 이해하지 못할 때 문제가 발생합니다.

그래서, 제대로 작동하는지 확인해 보셨습니까? 작동하지 않는다면 결과를 반환하고 세 번째 Linq 문에서 원하지 않는 규칙을 걸러내는 것이 합리적 일 수 있습니다.

+0

저는 로컬 쿼리와 SQL 쿼리를 혼합 할 수있는 문제가있었습니다. 또한, 결과를 필터링하려고하는 것이 아니라 좌측 - 외부가 필요하므로 데이터베이스에서 반환 된 규칙에 대한 항목/데이터가 있는지 여부에 관계없이 전달되는 항목에 대한 규칙 항목이 있는지 확인합니다. . 나는 옳은 일을하지 않을거야. 지옥, 나는 조인을 정확히 어디에서할지 확실하지 않습니다. – KingNestor

0

아직 반환하지 않은 지연 쿼리로 인해 발생할 수 있습니다. 특히 IEnumeratable <>을 사용하는 것을 고려할 때 ... 피사체에 Charlie Calvert's blog을 확인하고 .ToArray() 할당으로 인해 쿼리가 즉시 실행됩니다.

1

나는 약간의 메타 도움을 제공 할 수 있습니다. LINQPad을 잡아서 .Dump()를 사용하여 잘못된 위치를 확인해야합니다 (직접 SQL 번역도 볼 수 있습니다).

관련 문제