我正在使用以下查询(主要来自我收到的帮助here):
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.我希望每个代理商只包含传入的规则,如果没有数据,则只需将其内容保留为空。
现在,我的查询包含从数据库返回的所有规则及其数据。但是,我需要它只包含传递给方法的规则,无论它是否与从数据库返回的规则匹配。换句话说,我需要在我的本地“规则”对象上使用我现在的规则进行左外连接。
您可以看到我在上面的代码中添加了评论的位置,以解释我正在尝试的位置和内容。
因此,如果“规则”仅包含其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 :(得分:1)
我可以为你提供一些帮助。您应该抓住LINQPad并开始使用.Dump()来查看您出错的地方(您也可以查看直接的SQL翻译)。
答案 1 :(得分:0)
基本上,您使用与其他Linq源相同的方式对本地对象执行左外连接。当提供者可能不了解您正在做什么时,就会出现问题。
那么,你有没有尝试过明显的方法来看看它是否有效?如果这不起作用,那么您可能会发现只返回结果并在第三个Linq语句中过滤掉不需要的规则是合理的。
答案 2 :(得分:0)
这可能是由于尚未返回的延迟查询,特别是考虑到您使用IEnumeratable&lt;&gt; ...查看Charlie Calvert's blog主题,快速检查您是否可以尝试滑倒.ToArray()赋值将导致查询立即执行。