0

コード:

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日間にクローズ(解決)されている、ユーザーが(この場合、開いているか閉じているかにかかわらず、すべてのケースが取得されます)。

  • ShowFullCaseHistoryBoxWinformsチェックボックスです。チェックすると、アカウントの完全なケース履歴を取得する必要があります。

  • CrmCaseListItemDataGridViewのバッキングとして使用されるDTOです。コンストラクターでインシデントを取得し、グリッドに表示されるプロパティを公開します。

エラー:

'where'条件が無効です。エンティティメンバーが無効なプロパティまたはメソッドを呼び出しています。

質問:

何をしようとしているのですか、それは無効ですか?アカウントIDと一致する(したがって予測が必要な)最初の句は、それ自体で正常に機能したため、他の句の1つであると想定する必要がありますが、どちらかを判断することはできません。調査中のインシデントのプロパティは、投影または操作されません。これは、Queryablesの通常のノーノーであるため、ここでは本当に途方に暮れています。

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();

まだ機能していないのは、チェックボックスをチェックして完全なケース履歴を表示することだけです(基本的に、ステータスまたは解決日に関する前の2つの句のいずれかをオーバーライドします)。そのままでは機能しません(インライン式のコメントを解除します)。または、変数に抽出された場合は機能しません。他のすべては期待どおりに機能しているようです。この機能はオプションだったので、まったく機能しない場合は、方法も方法もありません。クライアントに優しく伝えますが、非常に近いので、これを機能させたいと思います。何かご意見は?

4

1 に答える 1

0

LINQ to CRM はクエリ式に変換する必要があります。クエリ式を扱う場合、オプション セット値の int 値を使用する必要があります。オプション セットのプロパティで .Value を呼び出し、列挙型を目的の値にキャストして、問題が解決するかどうかを確認してください。

エンティティに Early Bound Enum Properties を作成するEarly Bound Generatorを使用することもできます。そうすれば、列挙型を int にキャストする必要はなく、そこに入れる必要もありません.value

于 2013-02-02T14:40:23.713 に答える