2011-03-01 6 views
0

나는 에이전트, 클라이언트, 트랜잭션 및 폼을 가진 EDMX를 가지고있다. 에이전트의 트랜잭션 및 트랜잭션이있는 클라이언트에는 양식이 있습니다.SQL에서 Linq-to-Entities 쿼리

에이전트를위한 모든 엔티티를 한꺼번에 가져 와서 계층 적 트리 뷰에 넣으려는 경우 프로젝션을 사용하고 싶습니다. 트리 뷰는 선택된 연도별로 거래 및 양식 만 표시해야합니다.

SELECT c.*, t.*, f.* FROM Client c 
INNER JOIN Client_Bucket_Client cbc on cbc.Client_GUID = c.Client_GUID 
INNER JOIN Agent_Client_Bucket acb on acb.Client_Bucket_GUID = cbc.Client_Bucket_GUID 
LEFT OUTER JOIN [Transaction] t on t.Client_GUID = c.Client_GUID 
LEFT OUTER JOIN [Form] f on f.Transaction_GUID = t.Transaction_GUID 
WHERE f.Year = 2011 AND t.Year = 2011 AND acb.Agent_GUID = 'A29B6E94-3F1B-E011-B68A-001F290A2D4A' 
ORDER BY c.Last_Change_Date desc, c.File_Under 

지금 내 LINQ는 다음과 같습니다 :

SQL에서 내 쿼리는 다음과 같을 것이다

var clients = from client in ObjectContext.Clients 
        join cbc in ObjectContext.Client_Bucket_Client on client.Client_GUID equals cbc.Client_GUID 
        join acb in ObjectContext.Agent_Client_Bucket on cbc.Client_Bucket_GUID equals acb.Client_Bucket_GUID 
        where acb.Agent_GUID == agentGuid 
        orderby client.Last_Change_Date descending, client.File_Under 
        select client; 

    var clientInfos = 
     from c in clients 
     select new 
     { 
      Client = c, 
      TransactionInfos = ObjectContext.Transactions 
       .Where(t => t.Client_GUID == c.Client_GUID && t.Year == year) 
       .Select(t => new 
       { 
        Transaction = t, 
        ToAttach = ObjectContext.Forms.Where(f => f.Transaction_GUID == t.Transaction_GUID && f.Year == year) 
       }) 
     }; 

    // Looping over this query will hit the database *once* 
    foreach (var info in clientInfos) 
    { 
     foreach (var transactionInfo in info.TransactionInfos) 
     { 
      transactionInfo.Transaction.Forms.Attach(transactionInfo.ToAttach); 
     } 

     var tt = info.TransactionInfos.ToList(); //.Select(t => t.Transaction); 

     var trans = tt.Select(t => t.Transaction); 

     info.Client.Transactions.Attach(trans); 
    } 

    // Return a queryable object; constructing a new query from this will hit the database one more time 
    return clients; 

하지만 오류 얻을 :

로드 'GetTopLevelData'쿼리에 대해 작업을 수행하지 못했습니다. 명령 정의를 실행하는 중 오류가 발생했습니다. 자세한 내용은 내부 예외를 참조하십시오. 내부 예외 메시지 : 시간 종료가 만료되었습니다. 작업이 완료되기 전에 시간 초과 기간이 경과되었거나 서버가 응답하지 않습니다. System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute [TResultType]에서 System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands (하여 EntityCommand하여 EntityCommand, CommandBehavior를 동작)에서

(ObjectContext의 컨텍스트 : 여기

스택 트레이스이고 , ObjectParameterCollection parameterValues ​​System.Data.Objects.ObjectQuery 1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at RealForms.Web.Data.RealFormsService.GetTopLevelData(Guid agentGuid, Int32 year) in C:\Users\Bryan\Documents\Visual Studio 2010\Projects\RealForms\RealForms.Web.Data\RealFormsService.cs:line 590 at GetTopLevelData(DomainService , Object[]) at System.ServiceModel.DomainServices.Server.ReflectionDomainServiceDescriptionProvider.ReflectionDomainOperationEntry.Invoke(DomainService domainService, Object[] parameters) at System.ServiceModel.DomainServices.Server.DomainOperationEntry.Invoke(DomainService domainService, Object[] parameters, Int32& totalCount) at System.ServiceModel.DomainServices.Server.DomainService.Query(QueryDescription queryDescription, IEnumerable 1 & validationErrors, System.ServiceModel.DomainServices.Hosting.QueryProcessor.Process [TEntity]에서 INT32 &에서는 totalCount) (DomainService AT) System.Data.Objects.ObjectQuery 1.GetResults(Nullable에서 1 forMergeOption) domainService, DomainOperationEntry queryOperation, Object [] 매개 변수, ServiceQuery 서비스 eQuery, IEnumerable을 1& validationErrors, Int32& totalCount) at System.ServiceModel.DomainServices.Hosting.QueryOperationBehavior 1.QueryOperationInvoker.InvokeCore는 I이 오류는 특정 데이터를 발생하는 것을 발견하고있어

([] & 출력 오브젝트 []를 입력 객체 인스턴스 오브젝트). 뭔가 무언가가 보인다 somehwere ??

답변

0

JOIN을 SQL로 만들려면 LINQ에서 JOIN을 사용하지 않는 이유는 무엇입니까?

http://msdn.microsoft.com/en-us/library/bb534675.aspx

이것은 당신이 거래로 고객을 가입하는 방법입니다 :

var clientTransactions = clients 
     .Join(ObjectContext.Transactions, c => c.Client_GUID, t => t.Client_GUID, 
        (c,t) => new {Client = c, Transaction = t}); 

내가 가입이 구문을 사용하여 선호하는 귀하의 LINQ를 생산하는 SQL 쿼리를 예측하기 어렵다.

추신 : 시간 초과가 발생했습니다. 이는 데이터, 특히 데이터 양에 따라 다릅니다. LINQ가 SQL 서버에 보내는 쿼리를 프로파일 링 해보십시오.

+0

답장을 보내 주시면 귀하의 제안을 통해 LINQ를 좀 더 잘 이해할 수 있었지만 게시 한 SQL 쿼리를 살펴보면 클라이언트, 모든 클라이언트 트랜잭션 및 각각의 모든 Forms를 반환해야합니다. 트랜잭션. 두 조인을 함께 중첩하는 데 문제가 있습니다. 추가 도움이 크게 주시면 감사하겠습니다. – Ruggeri

0

다음 코드를 사용하여 문제점을 해결했습니다. 나는 Linq-to-Entities에 대해 아주 새로운데, 이것이 최선의 방법인지 아니면 선호하는 방법인지 확실하지 않지만, 그것은 나를 위해 일했습니다.

public IQueryable<Client> GetTopLevelData(Guid agentGuid, int year) 
{ 
    var clients = from client in ObjectContext.Clients 
        join cbc in ObjectContext.Client_Bucket_Client on client.Client_GUID equals cbc.Client_GUID 
        join acb in ObjectContext.Agent_Client_Bucket on cbc.Client_Bucket_GUID equals acb.Client_Bucket_GUID 
        where acb.Agent_GUID == agentGuid 
        orderby client.Last_Change_Date descending, client.File_Under 
        select client; 

    var clientTransactions = clients 
       .Join(ObjectContext.Transactions, c => c.Client_GUID, t => t.Client_GUID, 
          (c, t) => new { Transaction = t }); 

    var clientForms = clientTransactions 
       .Join(ObjectContext.Forms, t => t.Transaction.Transaction_GUID, f => f.Transaction_GUID, 
          (t, f) => new { Form = f }); 

    foreach (var client in clients) 
    { 
     var clientTrans = from trans in clientTransactions where trans.Transaction.Client_GUID == client.Client_GUID && trans.Transaction.Year == year select trans; 
     foreach (var trans in clientTrans) 
     { 
      client.Transactions.Attach(trans.Transaction); 

      var transForms = from forms in clientForms where forms.Form.Transaction_GUID == trans.Transaction.Transaction_GUID && forms.Form.Year == year select forms; 
      foreach (var form in transForms) 
      { 
       trans.Transaction.Forms.Attach(form.Form);                
      } 
     } 
    } 

    return clients; 
} 

은 내가 자식 트랜잭션 (transaction) 형태로 기록 후 예상 클라이언트는 결과 객체를로드 당겨, 그래서 여기에 방법에 둥지 Linq에 조인 연구하지만, 일을 아무것도 얻을 수 없습니다.더 이상 시간 초과 또는 (Nullable1 forMergeOption) 오류가 발생하지 않습니다.

도움을 주신 모든 분들께 감사드립니다.