2011-07-18 22 views
1

私の最終的な目標は、linq式をxmlをフェッチするように変換することです。私はこの記事からMS CRM 2011Linq式をQueryExpressionまたはFetchXMLに変換する

でカスタムグリッドのためのフェッチXMLを使用する予定が、私はFetchXML

http://mileyja.blogspot.com/2011/07/convert-queryexpression-to-fetchxml.htmlへのQueryExpressionを変換することができますしかし、私はのQueryExpressionにLINQの式を取得する方法がわかりません。私がlinq式を言うとき、私はタイプIQueryableのオブジェクトを意味します<>。

誰でもこの経験やノウハウを経験しましたか?

乾杯

答えて

0

あなたはIQuerable<T>からプロバイダを取得し、その上にメソッドを翻訳呼び出し、QueryExpressionを取得するためにリフレクションを使用することができますFetchXML

+0

私はこれを試しましたが、オブジェクトタイプ名を返します。私はこれに参照が見つかりましたが、CRM 4.0のみです。 – Chaos

2

を返す必要がありますLINQ式に対してtoString()を呼び出します。ここ

私が使用している拡張メソッドです:

public static QueryExpression ToQueryExpression(this IQueryable @this) 
{ 
    var provider = @this.Provider; 
    var translateMethod = provider.GetType().GetMethod("Translate"); 
    var query = (QueryExpression)translateMethod.Invoke(provider, new object[] { @this.Expression }); 

    return query; 
} 

あなたはExposedObjectのようにC#で反射のための動的なラッパーのいくつかの並べ替えを使用する場合は、ちょうどそのようSMTH行うことができます。

public static QueryExpression ToQueryExpression(this IQueryable @this) 
{ 
    dynamic provider = ExposedObject.From(@this.Provider); 

    return provider.Translate(@this.Expression); 
} 

としてフェッチするにはQueryExpressionが必要です。次にQueryExpressionToFetchXmlRequestという応答を返してQueryExpressionToFetchXmlResponseという応答を返します。応答はFetchXmlです。

+1

これはDynamics CRM 2013で壊れています。 サポートされている代替案については、このブログを参照してください。http://www.hashtagcrm.com/?p=157 – Chielus

3

Chielusに記載されているCRM2013 SDKアセンブリでは、提供されているソリューションは機能しません。

public static class QueryProviderExtensions 
{ 
    public static QueryExpression ToQueryExpression<T>(this IQueryable<T> items) 
    { 
     var queryProvider = items.Provider; 

     var queryProviderType = queryProvider.GetType(); 
     var listType = typeof(List<>); 

     var projectionType = queryProviderType.Assembly.GetType("Microsoft.Xrm.Sdk.Linq.QueryProvider+Projection"); 
     var navigationSourceType = queryProviderType.Assembly.GetType("Microsoft.Xrm.Sdk.Linq.QueryProvider+NavigationSource"); 
     var linkLookupType = queryProviderType.Assembly.GetType("Microsoft.Xrm.Sdk.Linq.QueryProvider+LinkLookup"); 
     var linkLookupListType = listType.MakeGenericType(linkLookupType); 

     object projection = null; 
     object source = Activator.CreateInstance(navigationSourceType, new object[] { null, null }); 
     object linkLookups = Activator.CreateInstance(linkLookupListType); 
     bool throwIfSequenceIsEmpty = false; 
     bool throwIfSequenceNotSingle = false; 

     object[] arguments = new object[6]; 
     arguments[0] = items.Expression; 
     arguments[1] = throwIfSequenceIsEmpty; 
     arguments[2] = throwIfSequenceNotSingle; 
     arguments[3] = projection; 
     arguments[4] = source; 
     arguments[5] = linkLookups; 

     var getQueryExpressionMethod = queryProviderType.GetMethod("GetQueryExpression", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public, null, new[] { 
       typeof(Expression), 
       typeof(bool).MakeByRefType(), 
       typeof(bool).MakeByRefType(), 
       projectionType.MakeByRefType(), 
       navigationSourceType.MakeByRefType(), 
       linkLookupListType.MakeByRefType(), 
      }, null); 

     var queryExpression = (QueryExpression)getQueryExpressionMethod.Invoke(queryProvider, arguments); 
     return queryExpression; 
    } 

    public static string ToXml(this QueryExpression queryExpression, IOrganizationService service) 
    { 
     var request = new QueryExpressionToFetchXmlRequest { Query = queryExpression }; 
     var response = (QueryExpressionToFetchXmlResponse)service.Execute(request); 
     return response.FetchXml; 
    } 
} 

がそうのようにそれを使用してください:ここ

// This can be any query 
    var query = (from e in contactSet.Query() 
       where e.LastName.Contains("e") 
       select e); 

    // This is where the magic happens 
    var queryExpression = query.ToQueryExpression(); 

    // We can now add paging info 
    queryExpression.PageInfo = new PagingInfo() 
    { 
     PageNumber = 1, 
     Count = 50, 
     ReturnTotalRecordCount = true 
    }; 

    // This will create a QueryExpressionToFetchXmlRequest, not needed for paging. 
    var xml = queryExpression.ToXml(service); 

    // Perform the actual request 
    var collection = service.RetrieveMultiple(queryExpression); 

詳細:

CRM2013のためには、この拡張メソッドを使用することができます(私は評判を持っていないので、申し訳ありませんが、私はそこにコメントすることはできません)

https://social.msdn.microsoft.com/Forums/en-US/0026f1de-bc10-428d-ad15-18d34315c814/convert-linq-query-to-fetchxml-sdk-2013?forum=crm

関連する問題