有這個查詢我得到一個InvalidOperationException:「單個聚合應用到的集合必須是空的或只包含一個項目」。如何解決「單個聚合應用於的集合必須爲空或者只包含一個項目」InvalidOperationException?
List<int> olsesUsedForTaskCompletion = new List<int>();
olsesUsedForTaskCompletion.AddRange(task.OrderLineSpecifications_QtysCompleted.Select(ols => ols.Key).ToList());
var allRelatedTasks = (from t in new XPQuery<Core.Model.Task.Task>(session, true)
join ols in new XPQuery<OrderLineSpecification>(session, true)
on t.PickSpecification equals ols.PickSpecification
where t.PickSpecification == task.PickSpecification
&& t.Status != TaskStatuses.Cancelled
&& olsesUsedForTaskCompletion.Contains(ols.Oid)
select t).ToList();
我希望當我做連接,以獲得只有具有特定Id的OLS。我究竟做錯了什麼?
這是堆棧跟蹤:
at DevExpress.Xpo.Helpers.InTransactionLoader.ProcessException(Exception ex)
at DevExpress.Xpo.Helpers.InTransactionLoader.ProcessAnalyzeAndExecQuery()
at DevExpress.Xpo.Helpers.InTransactionLoader.Process()
at DevExpress.Xpo.Helpers.InTransactionLoader.GetObjects(ObjectsQuery[] queries)
at DevExpress.Xpo.Helpers.InTransactionLoader.GetObjects(Session session, ObjectsQuery[] queries)
at DevExpress.Xpo.Session.<>c__DisplayClass16.<GetObjectsInTransaction>b__14()
at DevExpress.Xpo.Logger.LogManager.Log[T](String category, LogHandler`1 handler, MessageHandler`1 createMessageHandler)
at DevExpress.Xpo.Session.GetObjectsInTransaction(XPClassInfo classInfo, CriteriaOperator condition, SortingCollection sorting, Int32 skipSelectedRecords, Int32 topSelectedRecords, Boolean selectDeleted)
at DevExpress.Xpo.XPQueryBase.SessionGetObjects(XPClassInfo classInfo, CriteriaOperator condition, SortingCollection sorting, Int32 skipSelectedRecords, Int32 topSelectedRecords, Boolean selectDeleted)
at DevExpress.Xpo.XPQueryBase.GetObjects()
at DevExpress.Xpo.XPQueryBase.Enumerate(Type type)
at DevExpress.Xpo.XPQuery`1.GetEnumerator()
at DevExpress.Xpo.XPQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Davanti.WMS.Services.Implementation.Outbound.OrderLineSpecificationStatusService.ChangeStatusToPickedToShipToStageOrStaged(Session session, IList`1 tasks, IList`1 olsWithoutTasks) in c:\Corax\DAV_WMS\DEV\SRC\APP\WMS\Davanti.WMS.Services.Implementation\Outbound\OrderLineSpecificationStatusService.cs:line 471
更新: 這裏一番折騰後,我做了什麼: - 用另一種方法來。我不知道你是否可以獲得它的業務邏輯,但是我已經用OLS生成了第一個列表,然後我用另一個規範生成了另一個列表。稍後我會對任務做一個簡單的查詢。
// compose list of olses for which status will be updated
List<OrderLineSpecification> olSpecs = (from ols in new XPQuery<OrderLineSpecification>(session, true)
where ols.Status != OrderLineSpecificationStatus.Cancelled
//...
&& ols.PickSpecification == task.PickSpecification
&& (olsesUsedForTaskCompletion.Count == 0
|| (olsesUsedForTaskCompletion.Contains(ols.Oid) && ols.QtyOrdered == ols.QtyPicked))
select ols).ToList();
var pickSpecificationKeys = (from ols in olSpecs select ols.PickSpecification.Oid).Distinct().ToList();
var allRelatedTasks = (from t in new XPQuery<Core.Model.Task.Task>(session, true)
where pickSpecificationKeys.Contains(t.PickSpecification.Oid)
&& t.Status != TaskStatuses.Cancelled
select t).ToList();
我只是希望,這將工作,無論客戶的數據庫結構,雙排引用或使... :)
你很高興展示你的完整調用堆棧,但是如果你沒有給出你的代碼片段的過程的名稱,它沒有多大用處。 processException中的異常,而不是ProcessAnalyzeAndExecQuery中的異常。你確定你的代碼片段來自processException嗎? –
上面的代碼位於ChangeStatusToPickedToShipToStageOrStaged()方法中。 –
不知道它是否有幫助,但你可以嘗試聲明'var first = new XPQuery(session,true)'和'var second = new XPQuery (session,true)' ,然後在你的查詢中使用它們,例如'(從第一次加入ols到第二個''。 –