2009-09-14 101 views
1

JOIN我有这样的LINQ查询:生成充满LinqToSQL

(from rapportBase in New_RapportReferencementBases 
join rapportExtensionAll in New_RapportReferencementExtensionBases on rapportBase.New_RapportReferencementId equals rapportExtensionAll.New_RapportReferencementId into jointureRapportExtension 
from rapportExtension in jointureRapportExtension.DefaultIfEmpty() 

join packExtensionAll in New_PackExtensionBases on rapportExtension.New_PackId equals packExtensionAll.New_PackId into jointurePackExtension 
from packExtension in jointurePackExtension.DefaultIfEmpty() 
join packBaseAll in New_PackBases on packExtension.New_PackId equals packBaseAll.New_PackId into jointurePackBase 
from packBase in jointurePackBase.DefaultIfEmpty() 

join domaineBaseAll in New_DomaineBases on packExtension.New_DomaineId equals domaineBaseAll.New_DomaineId into jointureDomaineBase 
from domaineBase in jointureDomaineBase.DefaultIfEmpty() 
join domaineExtensionAll in New_DomaineExtensionBases on domaineBase.New_DomaineId equals domaineExtensionAll.New_DomaineId into jointureDomaineExtension 
from domaineExtension in jointureDomaineExtension.DefaultIfEmpty() 

join compteBaseAll in AccountBases on domaineExtension.New_AccountId equals compteBaseAll.AccountId into jointureCompteBase 
from compteBase in jointureCompteBase.DefaultIfEmpty() 
join compteExtensionAll in AccountExtensionBases on compteBase.AccountId equals compteExtensionAll.AccountId into jointureCompteExtension 
from compteExtension in jointureCompteExtension.DefaultIfEmpty() 
select rapportBase) 

其产生:

SELECT [t0].[New_RapportReferencementId], [t0].[CreatedOn], [t0].[CreatedBy], [t0].[ModifiedOn], [t0].[ModifiedBy], [t0].[OwningUser], [t0].[OwningBusinessUnit], [t0].[statecode] AS [Statecode], [t0].[statuscode] AS [Statuscode], [t0].[DeletionStateCode], [t0].[VersionNumber], [t0].[ImportSequenceNumber], [t0].[OverriddenCreatedOn], [t0].[TimeZoneRuleVersionNumber], [t0].[UTCConversionTimeZoneCode] 
FROM [New_RapportReferencementBase] AS [t0] 
LEFT OUTER JOIN [New_RapportReferencementExtensionBase] AS [t1] ON [t0].[New_RapportReferencementId] = [t1].[New_RapportReferencementId] 
LEFT OUTER JOIN [New_PackExtensionBase] AS [t2] ON [t1].[New_PackId] = ([t2].[New_PackId]) 
LEFT OUTER JOIN [New_PackBase] AS [t3] ON [t2].[New_PackId] = [t3].[New_PackId] 
LEFT OUTER JOIN [New_DomaineBase] AS [t4] ON [t2].[New_DomaineId] = ([t4].[New_DomaineId]) 
LEFT OUTER JOIN [New_DomaineExtensionBase] AS [t5] ON [t4].[New_DomaineId] = [t5].[New_DomaineId] 
LEFT OUTER JOIN [AccountBase] AS [t6] ON [t5].[New_AccountId] = ([t6].[AccountId]) 
LEFT OUTER JOIN [AccountExtensionBase] AS [t7] ON [t6].[AccountId] = [t7].[AccountId] 

但我想生成:

SELECT [t0].[New_RapportReferencementId], [t0].[CreatedOn], [t0].[CreatedBy], [t0].[ModifiedOn], [t0].[ModifiedBy], [t0].[OwningUser], [t0].[OwningBusinessUnit], [t0].[statecode] AS [Statecode], [t0].[statuscode] AS [Statuscode], [t0].[DeletionStateCode], [t0].[VersionNumber], [t0].[ImportSequenceNumber], [t0].[OverriddenCreatedOn], [t0].[TimeZoneRuleVersionNumber], [t0].[UTCConversionTimeZoneCode] 
FROM [New_RapportReferencementBase] AS [t0] 
FULL OUTER JOIN [New_RapportReferencementExtensionBase] AS [t1] ON [t0].[New_RapportReferencementId] = [t1].[New_RapportReferencementId] 
FULL OUTER JOIN [New_PackExtensionBase] AS [t2] ON [t1].[New_PackId] = ([t2].[New_PackId]) 
FULL OUTER JOIN [New_PackBase] AS [t3] ON [t2].[New_PackId] = [t3].[New_PackId] 
FULL OUTER JOIN [New_DomaineBase] AS [t4] ON [t2].[New_DomaineId] = ([t4].[New_DomaineId]) 
FULL OUTER JOIN [New_DomaineExtensionBase] AS [t5] ON [t4].[New_DomaineId] = [t5].[New_DomaineId] 
FULL OUTER JOIN [AccountBase] AS [t6] ON [t5].[New_AccountId] = ([t6].[AccountId]) 
FULL OUTER JOIN [AccountExtensionBase] AS [t7] ON [t6].[AccountId] = [t7].[AccountId] 

换句话说,我想为此查询生成完整的外连接,而不仅仅是留下。

有人知道如何以简单的方式做到这一点?

感谢

回答

1

Linq中没有完全外部联接。你必须做两个左连接并将它们连接在一起。下面是一些伪代码,看起来像LINQ:

var foj = 
    (from l in left 
    join r in right on l.Id equals r.Id into g 
    from r in g.DefaultIfEmpty() 
    select new { l, r }) 
    .Concat 
    (from r in right 
    join l in left on r.Id equals l.Id into g 
    from l in g.DefaultIfEmpty() 
    where l == null 
    select new { l, r }); 

可能会更好这样的逻辑推到存储过程中,如果你使用的LINQ到SQL计划。

0

可悲的是我之前看到过,但我想确定。

我们所做的事情是在存储过程中完成并通过linqtosql方法访问它。

然后我们映射表的结果,就像linqtosql做的那样,使用分组获得enties链接到另一个实体的集合。

例如,如果我们有一个帐户与一些联系人链接到它。我们要求所有联系人为他们每个人提供一个完全加入的账户和他们的账户ID组,以获得每个联系人的列表。

它工作得很好,但它会更好,如果linqtosql能够生成完全加入....