Une partie de votre instruction SQL est imbriqué trop profondément. La réécriture de la requête ou de le diviser en petites requêtes
J'ai dans mes contrôleur qui appelle la méthode suivante :
public IQueryable<AaaUserContactInfo> getcontactinfo(long[] id)
{
var organizationsiteids = from accountsitemapping in entities.AccountSiteMappings
where id.Any(accountid => accountsitemapping.ACCOUNTID == accountid)
select accountsitemapping.SITEID;
var usersdepts = from userdept in entities.UserDepartments
join deptdefinition in entities.DepartmentDefinitions on userdept.DEPTID equals deptdefinition.DEPTID
where organizationsiteids.Any(accountid => deptdefinition.SITEID == accountid)
select userdept;
var contactsinfos = from userdept in usersdepts
join contactinfo in entities.AaaUserContactInfoes on userdept.USERID equals contactinfo.USER_ID
select contactinfo;
return contactsinfos;
}
Mais quand je lance l'application et je navigue à la méthode d'action, ce qui suit erreur sera porté sur le niveau d'affichage de:-
System.Data.EntityCommandExecutionException was unhandled by user code
HResult=-2146232004
Message=An error occurred while executing the command definition. See the inner exception for details.
Source=System.Data.Entity
StackTrace:
at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues)
at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
at System.Data.Entity.Internal.Linq.InternalQuery`1.GetEnumerator()
at System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator()
at System.Linq.Enumerable.Count[TSource](IEnumerable`1 source)
at ASP._Page_Views_Home_CustomersDetails_cshtml.Execute() in c:\Users\Administrator\Desktop\new app DEMO2\MvcApplication4 - LATEST -\MvcApplication4\Views\Home\CustomersDetails.cshtml:line 6
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
at System.Web.WebPages.StartPage.RunPage()
at System.Web.WebPages.StartPage.ExecutePageHierarchy()
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
InnerException: System.Data.SqlClient.SqlException
HResult=-2146232060
Message=Some part of your SQL statement is nested too deeply. Rewrite the query or break it up into smaller queries.
Source=.Net SqlClient Data Provider
ErrorCode=-2146232060
Class=15
LineNumber=105
Number=191
Procedure=""
StackTrace:
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
InnerException:
Quelle est donc la cause de cette erreur??
Mise à JOUR:-
OriginalL'auteur John Peter | 2013-01-04
Vous devez vous connecter pour publier un commentaire.
LINQ, pour la plupart de ses commandes, emploie l'exécution différée. Il attend jusqu'à ce que vous avez fait appel pour les données avant d'envoyer la requête à la base de données. Ici, il ressemble à tous ces requêtes sont reportés jusqu'à ce que plus tard, quand vous essayez d'attraper quelque chose de contactInfos.
Je voudrais essayer de l'avoir à l'exécuter, comme en jetant un .ToList() quelque part, pour tenter de réduire l'imbrication qui serait sinon va sur le SQL.
EDIT: Depuis, par les commentaires, vous semblez être l'obtention de l'erreur sur la première question, pourriez-vous s'il vous plaît essayer et de dire
where id.Contains(accountsitemapping.ACCOUNTID)
?Une raison de plus, alors, de briser les requêtes. Si vous voulez que votre application à l'échelle, vous allez avoir besoin de les casser.
ce que vous entendez par casser, et ne peut pas casser plus de la façon dont je suis en train de faire ?
Comme dans ne laissez pas l'exécution différée le faire pour vous. Utiliser .ToList après la première ou la seconde requête pour empêcher que cela se produise.
La droite. C'est ce qui donne l'erreur là, parce que c'est là que la requête est en fait en cours d'exécution (au lieu de avant d'être sur le point de vue en raison de l'exécution différée). Voir mon montage pour une autre solution possible.
OriginalL'auteur
Référence pour l'avenir, vous pouvez vous connecter le SQL généré à l'aide de:
Cela vous permettra de déterminer quelle partie est d'obtenir profondément imbriqués. À partir de là, vous pouvez avoir à ré-écrire votre requête pour charger coûteux calculs dans une deuxième étape. Ou de considérer l'écriture comme une procédure stockée.
dataContext.Log = Console.Out
Si à l'aide d'un DataContext au lieuOriginalL'auteur