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