簡體   English   中英

為什么我的LINQ to Objects查詢不返回任何結果?

[英]Why doesn't my LINQ to Objects query return any results?

我正在使用以下查詢(主要來自我在這里獲得的幫助):

    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規則作為參數傳遞給此方法。

我想做的是在第二個查詢中為每個代理創建規則列表,我想在本地“規則”對象上進行左外部聯接。 我傳入的每個規則對象都有一個rule.ID。 我希望每個代理機構僅包含傳入的規則,如果沒有用於它們的數據,則只需將其內容保留為空。

現在,我的查詢包含從數據庫返回的所有規則及其數據。 但是,我需要它僅包含傳遞給該方法的規則,而不管它是否與從數據庫返回的規則匹配。 因此,換句話說,我需要使用我現在在其中的規則對本地“規則”對象進行左外部聯接。

您可以看到我在上面的代碼中添加注釋的位置,以解釋我要在哪里和做什么。

因此,如果“規則”僅包含3個設置了ID的規則,則該查詢將只為每個代理商返回這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
                   };
}

沒有骰子。 現在,我得到的不是所有規則,而是〜no〜規則。 當我想要的只是獲取要傳遞給此方法的規則時。

有人可以指出我正確的方向嗎?

我可以為您提供一些元幫助。 您應該抓住LINQPad並開始使用.Dump()來查看出錯的地方(也可以查看直接的SQL轉換)。

基本上,您對本地對象進行左外部連接的方式與對任何其他Linq源進行處理的方式相同。 當提供者可能不了解您在做什么時,就會出現問題。

那么,您是否嘗試過以明顯的方式查看它是否有效? 如果這不起作用,那么您可能會發現,簡單地返回結果並在第三條Linq語句中過濾掉不需要的規則是合理的。

這可能是由於尚未返回的延遲查詢所致,尤其是考慮到您使用IEnumeratable <> ...請查看Charlie Calvert關於該主題的博客 ,以快速檢查您可以嘗試使用.ToArray()賦值之類的方法將導致查詢立即執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM