2012-07-10 25 views
3

我有3个对象,我需要链接在一起2级的加入LINQ

家长:TblClients
这将对类型TblBusinessLeads的多个孩子,这两者之间的关键是客户端ID
式铅会有型TblFeeBreakouts的多个孩子,这两者之间的关键是LeadID

我写了下面的LINQ得到databack,但它不会再回来(内存溢出异常)

from t0 in TblClients 
join t1 in TblBusinessLeads on t0.ClientID equals t1.ClientID into t1_join 
from t1 in t1_join.DefaultIfEmpty() 
join t3 in TblFeeBreakouts on t1.LeadID equals t3.LeadID into t3_join 
from t3 in t3_join.DefaultIfEmpty() 
orderby 
t0.ClientID, 
t1.LeadID 
select new { 
      client_data = t0, 
      business_lead_data = t1_join, 
      fee_breakout_data = t3_join 
} 

我不确定你甚至可以这样做,但这个想法似乎很常见。任何帮助将不胜感激。谢谢

编辑
WOW很多意见。这里不用我的答案 我试图运行LinqPad查询,这就是在内存不足是发生 如果我看一下生成的SQL,它给了我

SELECT [t0].[ClientID], [t0].[ClientName], [t0].[ClientDesc], [t0].[EditedBy], [t0].[EditedDate], [t0].[CreatedBy], [t0].[CreatedDate], [t3].[LeadID], [t3].[InitiativeName], [t3].[Description], [t3].[NewBusNeeds], [t3].[CreativeNeeds], [t3].[IdeationNeeds], [t3].[Comments], [t3].[LossReasons], [t3].[OriginDate], [t3].[DateReceivedAssignment], [t3].[DueDate], [t3].[TimelineNotes], [t3].[PendingCode], [t3].[EstStartDate], [t3].[EstEndDate], [t3].[ExeStartDate], [t3].[ExeEndDate], [t3].[Probable80Total], [t3].[Possible50Total], [t3].[Emerging25Total], [t3].[NoBudget0Total], [t3].[TotalBudget], [t3].[FinancialNotes], [t3].[DollarsRecordFor], [t3].[BizDevContactUserID], [t3].[BizDevContact2UserID], [t3].[SVPContactUserID], [t3].[ClientMgmtContactUserID], [t3].[CMAdditionalContactUserID], [t3].[AdditionalContactUserID], [t3].[CreatorUserID], [t3].[OfficeID], [t3].[ClientID] AS [ClientID2], [t3].[LeadTypeID], [t3].[ActionNeeded], [t3].[ActionDate], [t3].[NewBusDeliveryDate], [t3].[NewBusDesc], [t3].[CreativeDeliveryDate], [t3].[CreativeDesc], [t3].[IdeationDeliveryDate], [t3].[IdeationDesc], [t3].[AltMediaDeliveryDate], [t3].[AltMediaDesc], [t3].[MobileOpsDeliveryDate], [t3].[MobileOpsDesc], [t3].[EventsDeliveryDate], [t3].[EventsDesc], [t3].[Routing], [t3].[RoutingDate], [t3].[Deleted], [t3].[LeadSourceID], [t3].[NatureofLeadID], [t3].[NatureofLeadNotes], [t3].[EditedBy] AS [EditedBy2], [t3].[EditedDate] AS [EditedDate2], [t3].[CreatedBy] AS [CreatedBy2], [t3].[CreatedDate] AS [CreatedDate2], [t3].[ClientContactName], [t3].[ClientContactTitle], [t3].[ReportingYear], (
SELECT COUNT(*) 
FROM [tblBusinessLead] AS [t4] 
WHERE [t0].[ClientID] = [t4].[ClientID] 
) AS [value], [t1].[LeadID] AS [LeadID2] 
FROM [tblClient] AS [t0] 
LEFT OUTER JOIN [tblBusinessLead] AS [t1] ON [t0].[ClientID] = [t1].[ClientID] 
LEFT OUTER JOIN [tblFeeBreakout] AS [t2] ON [t1].[LeadID] = [t2].[LeadID] 
LEFT OUTER JOIN [tblBusinessLead] AS [t3] ON [t0].[ClientID] = [t3].[ClientID] 
ORDER BY [t0].[ClientID], [t1].[LeadID], [t2].[LeadID], [t2].[FeeTypeID], [t3]. [LeadID] 

这将返回象120万行

有模型监守数据库的映射关系,没有关系,(他们推断,没有外键或类似的东西)

我使用t1_join和t3_join的原因是因为如果我使用T1或T3,我获取单个实体,而不是该对象的IEnumerable,因此我无法循环它。

如果您还有其他问题,请询问。

+0

@JeffMercado - 他们需要,如果他试图做一个左连接... – EkoostikMartin 2012-07-10 15:21:35

+0

@IsaacLevin - 这是LinQ实体?如果你在SQL中运行这个结果集,结果集的大小是多少?你还可以在你的代码片段中包含整个语句(赋值语句和任何铸件,如果存在的话) – EkoostikMartin 2012-07-10 15:25:36

+1

你的实体之间是否有多对多映射?然后,您可以避开连接并只引用导航属性。 – Erica 2012-07-10 15:27:10

回答

0

首先,客户可以使用120万行?对此没有真正的好用例,所以你的第一步应该是弄清楚如何适当地过滤你的结果。

其次,我相信您的查询返回OutOfMemoryException的原因是因为LinQPad正在执行ToList()或类似的操作,因此我可以在底部窗格中显示查询结果。 ToList()正在将所有120万行加载到内存中。如果您在常规的.Net应用程序中运行查询,则以下内容将返回不会加载到内存中的IQueryable<>

var query = 
from t0 in TblClients 
join t1 in TblBusinessLeads on t0.ClientID equals t1.ClientID into t1_join 
from t1 in t1_join.DefaultIfEmpty() 
join t3 in TblFeeBreakouts on t1.LeadID equals t3.LeadID into t3_join 
from t3 in t3_join.DefaultIfEmpty() 
orderby 
t0.ClientID, 
t1.LeadID 
select new { 
      client_data = t0, 
      business_lead_data = t1_join, 
      fee_breakout_data = t3_join 
}; 
+0

你对过滤是正确的,但是将OP的代码复制/粘贴到IQueryable变量中并不是很有意义。总有一天它应该被枚举。 – 2012-07-10 20:18:03

+0

我相信这些方法不止一些 - http://msdn.microsoft.com/en-us/library/system.linq.queryable_methods.aspx - 不需要枚举整个结果...是不是有意义? – EkoostikMartin 2012-07-10 20:42:13

+0

当然,但无论如何,无论有无变量,OP都可以做到这一点。过滤是关键。 – 2012-07-10 20:45:08

0

如上所述,它可能是一个好主意,这些表的设置asociations,我做到了......的LINQ的结果后,该协会是简单

VAR客户端列表=(从在tblClients 中选择a).ToList();

从那里它只是访问属性。