3

一緒にリンクする必要がある 3 つのオブジェクトがあります

親: TblClients
これには、タイプ TblBusinessLeads の複数の子があり、2 つの間のキーは ClientID
です

データバックを取得するために次の LINQ を作成しましたが、戻ってきません (メモリ不足の例外)。

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
}

これができるかどうかはわかりませんが、アイデアはかなり一般的です。どんな助けでも大歓迎です。ありがとう

編集
たくさんのコメントがあります。これが私の答えです。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万行のように返されます

DBには関係がないため、モデルにマッピングはありません(それらは推測され、外部キーなどはありません)

t1_join と t3_join を使用している理由は、t1 または t3 を使用すると、オブジェクトの IEnumerable ではなく単一のエンティティを取得するため、ループできないためです。

さらに質問がある場合は、お尋ねください。

4

2 に答える 2

0

上記のように、これらのテーブルに関連付けを設定することはおそらく良い考えです。関連付け後の結果の LINQ は単純でした。

var clientList = (tblClients の a から a).ToList(); を選択します。

そこからは、プロパティにアクセスするだけでした。

于 2012-07-10T17:28:02.617 に答える
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
};
于 2012-07-10T16:27:16.743 に答える