6

Linq for CRM 2011がひどく壊れていることがわかりました。これは、QAが実行されていない状態で侵入したようです。プロバイダーがどれほどひどく壊れているかを示すインジケーターは、.Where(x => x == "b")のようなクエリですが、この.Where(x => "b" == x)は、参加ステートメント。私は実際にクエリプロバイダーの一部を書き直さなければならず、私がまとめたがらくたで幸運を楽しんでいます。

しかし、これは続けることができず、まだ他の問題があり、私はMSのために働くためにお金を払っていないので、私は代替案を探しています。これらの2つは、ここで詳しく説明されているようにQueryExpressionとFetchXmlを作成しました:http://msdn.microsoft.com/en-us/library/gg334607.aspx

QueryExpressionとFetchXmlを使用することの正直で現実的な長所と短所を誰かに教えてもらえますか?パフォーマンス、開発速度、堅牢性、柔軟性の点でそれらがどのように比較されるかを知りたいです。

4

4 に答える 4

11

LINQ と FetchXml に焦点を当てた Anwar の優れた回答に基づいて構築するために、 I never useを追加しますQueryExpressionなぜですか?

LINQ : クエリは標準言語を使用して構築されますが、内部で QueryExpression を使用するため、QueryExpression の機能に制限されます。

QueryExpression : クエリはオブジェクト モデルとして構築されます。集計とグループ化を除く FetchXML のすべての機能をサポートします。

したがって、高度な検索コード生成がFetchXml ない場合よりもクエリ能力が低下し、LINQ プロバイダーと同じ機能を提供しながら、完全に非標準のクエリ インターフェイスを提供します (LINQ とは異なります)。

LINQ の (非) 機能に関しては、LINQ プロバイダーの制限は明確であり、文書化されていることはかなり適切だと思います。.Where(x => "b" == x)たとえば、スニペットは句の制限に違反していますwhere

where : 句の左側は属性名で、句の右側は値である必要があります。左辺を定数に設定することはできません。節の両側を定数にすることはできません。

Microsoft を擁護するものではありません: LINQ プロバイダーがプロフェッショナル グレードになる前に、LINQ プロバイダー (読み: SQL への直接プロバイダー) に多くの作業を行う必要がありますが、少なくとも、素晴らしい免責事項があります。

于 2012-02-08T02:30:57.747 に答える
10

私の意見では、通常は要件に応じて Linq または FetchXml を使用します。

Linqの場合:早期バインドの場合、Linqは強く型付けされており、開発速度に非常に役立つため、Linqを使用するのが好きですが、上で述べたように、欠点があります。

FetchXML の場合: 私は次の魔法のステートメントを使用するのが大好きです。

EntityCollection result = _serviceProxy.RetrieveMultiple(new FetchExpression(fetch2));

foreach (var c in result.Entities)
{
   System.Console.WriteLine(c.Attributes["name"]);
}

なんで?集計グループ化に加えて QueryExpression を使用するのと非常に似ているためです。私が FetxhXML で唯一嫌いな点は、Linq とは異なり、ビルドが難しいことです。

FetchXML クエリを作成するには、Advanced-Find を開いて列を追加し、条件を入力する必要があります。最後にダウンロードしてコードにコピーします。

最後に、FetchXML は他の制限の中で最も制限が少ないです。

StopWatchを使用して同じクエリに対して Linq と FetchXML の間でベンチマークを試みたパフォーマンスに関しては、結果は FetchXML が Linq よりも高速でした。

于 2012-02-07T19:29:17.203 に答える
6

クライアントから特にクエリ式モデルを使用するように依頼されたので、作業を楽にするために、IOrganizationService に多くの拡張メソッドを追加することにしました。例は次のとおりです。

public static List<T> GetEntities<T>(
    this IOrganizationService service, 
    params object[] columnNameAndValuePairs
) where T : Entity

params object[] と T エンティティ タイプをクエリ式に変換し、結果をエンティティ リストに自動的に返します。したがって、次のように使用されます。

foreach(var c in service.GetEntities<Contact>("lastname", "Doe", "firstname", "Smith"))
{
    ... 
}

私もこれをよく使います:

public static T GetFirstOrDefault<T>(
    this IOrganizationService service,
    params object[] columnNameAndValuePairs
) where T : Entity

var c = service.GetFirstOrDefault<Contact>("owner", id);

これらのタイプの拡張メソッドにより、クエリ式の操作がはるかに簡単になり、陥りやすい奇妙な linq 制限トラップなしで、はるかに多くの LINQ 型スタイルが提供されます。

于 2012-02-08T15:13:14.750 に答える