簡體   English   中英

CRM Linq查詢事件-無效條件

[英]CRM Linq query for Incidents - Invalid where condition

代碼:

var site = CrmRepository.QueryFor<Account>()
                .Where(a => a.iss_OperatorSiteId == OperatorSiteId.ToString())
                .FirstOrDefault();
SiteCases = CrmRepository.QueryFor<Incident>()
                    .Where(i => i.AccountId.Id == site.Id
                                && (i.iss_Status != new OptionSetValue(
                                      (int)StatusOptionSet.Closed) 
                                   && i.iss_Status != new OptionSetValue(
                                      (int)StatusOptionSet.PendingFinalization))
                                || (i.iss_ResolutionDate == null 
                                    || i.iss_ResolutionDate > 
                                          DateTime.Today.AddDays(-30))
                                || (ShowFullCaseHistoryBox.Checked))
                    .AsEnumerable()
                    .Select(i => new CrmCaseListItem(i))
                    .ToList();

細節:

  • CrmRepository是CrmSvcUtil生成的CRM Linq上下文的包裝,將其調整為適用於其他數據存儲的通用IRepository接口。 QueryFor<Incident>()調用等效於上下文本身的CreateQuery<Incident>()調用。

  • iss_Status是“選項集”類型的屬性。 StatusOptionSet是一個枚舉,旨在簡化代碼中選項值的使用。

  • iss_ResolutionDate是不言自明的,並且包括在內,而不是為了簡單起見引用“案例解決方案”記錄,並且因為在我們的工作流程中,直到問題不僅得到解決,而且案例記錄和相關記錄才被“解決”。已經過處理和審核,因此對於SLA義務,我們需要知道何時解決問題與何時應用解決方案完全解決此問題無關。

  • 基本思想是顯示與特定帳戶相關聯的事件(我們稱為“案例”),這些事件處於打開狀態或在最近30天內被關閉(已解決), 或者用戶希望查看完整的歷史記錄(在檢索所有打開或關閉的案例)。

  • ShowFullCaseHistoryBox是Winforms復選框; 選中后,應檢索該帳戶的完整案例歷史記錄。

  • CrmCaseListItem是一個DTO,用作DataGridView的后備; 它在其構造函數中使用事件,並公開網格上顯示的屬性。

錯誤:

無效的“ where”條件。 實體成員正在調用無效的屬性或方法。

問題:

我要做什么是無效的? 第一個與帳戶ID匹配的子句(因此需要一個預測)本身就可以正常工作,因此我必須假定它是另一個,但我無法確定哪個。 被檢查的事件的屬性不會被投影或操縱,這對Queryable來說通常是禁忌,所以我在這里真的很茫然。

EDIT(已再次編輯):

在通過一些測試對它進行評估以評估每個單獨的子句之后,使用到目前為止的一些建議並將該子句的所有已知的良好元素重新插入一起,這是最有效的方法:

var site = CrmRepository.QueryFor<Account>()
                .Where(a => a.iss_OperatorSiteId == OperatorSiteId.ToString())
                .FirstOrDefault();
SiteCases = CrmRepository.QueryFor<Incident>()
                .Where(i => (i.AccountId.Id == site.Id) &&
                       (
                           (i.iss_Status.Value != (int) StatusOptionSet.Closed
                            && i.iss_Status.Value != (int) StatusOptionSet.PendingFinalization)
                           || (i.iss_ResolutionDate != null
                               && i.iss_ResolutionDate.Value > DateTime.Today.AddDays(-30))
                       //|| ShowFullCaseHistoryBox.Checked
                       )
                )
                .AsEnumerable()
                .Select(i => new CrmCaseListItem(i))
                .ToList();

唯一仍然不起作用的是檢查CheckBox,以顯示完整的案例歷史記錄(基本上覆蓋了有關狀態或解決日期的前兩個子句之一)。 它不能按原樣運行(取消對內聯表達式的注釋),也不能將其提取到變量中。 其他一切似乎都按預期工作。 該功能是可選的,因此,如果它根本無法使用,根本不可能,怎么做,那么我將它輕輕地提供給客戶端,但是我真的很想讓它起作用,因為我已經非常接近了。 有什么想法嗎?

LINQ to CRM必須轉換為查詢表達式。 處理查詢表達式時,必須使用選項設置值的int值。 嘗試在選項集屬性上調用.Value,然后將枚舉強制轉換為預期值,以查看是否可以解決問題。

您還可以使用Early Bound Generator ,它在您的實體上創建Early Bound Enum屬性。 這樣,您就不必將枚舉轉換為整數,也不必將.value放入其中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM