2011-11-23 30 views
1

我正在嘗試爲定義基於XML的語言來查詢地理空間數據源的標準的.NET實現(對於感興趣的人爲OGC 04-095)。我將這些查詢轉化爲LINQ表達式,這樣我就可以訪問任何類型的源代碼(當然,前提是有一個LINQ提供程序)。LINQ跨多個LINQ提供者的LIKE實現

作爲一項要求,我必須實現LIKE運算符。我知道我可以使用SqlMethods.Like方法,但這會限制我使用SQL數據源。問題是:是否有可能實現跨不同供應商的實施?

我心裏有什麼,現在應該是:

  • 如果提供者是LINQ to SQL中,使用SqlMethods.Like方法(以便查詢可以在數據庫上運行)。
  • 如果不是,請提供我自己的(以便它可以在內存中運行)。

當然,如果我能檢測到LINQ表達式將在其上執行的提供程序的類型,這種情況纔有可能。我甚至不知道這是否可能。

例如,下面的XML將所述輸入查詢的一部分:

<ogc:PropertyIsLike> 
    <ogc:PropertyName>myProperty</ogc:PropertyName> 
    <ogc:Literal>%SOMETHING%TO_SEARCH%</ogc:Literal> 
</ogc:PropertyIsLike> 

代碼解釋本的簡化摘錄是:

using System.Data.Linq.SqlClient; 
using System.Linq.Expressions; 

public interface IExpressionBuilder 
{ 
    Expression CreateExpression(ExpressionBuilderParameters parameters); 
} 

partial class PropertyIsLike: 
    IExpressionBuilder 
{ 
    protected override Expression CreateExpression(ExpressionBuilderParameters parameters) 
    { 
     // Only works with the LINQ to SQL provider 
     return Expression.Call(
      typeof(SqlMethods).GetMethod("Like", new Type[] { typeof(string), typeof(string) }), 
      ((IExpressionBuilder)PropertyName).CreateExpression(parameters), 
      ((IExpressionBuilder)Literal).CreateExpression(parameters) 
     ); 

     //TODO: if provider is not LINQ to SQL, provide client side implementation 
     // LINQ provider detection possible? 
    } 
} 

ExpressionBuilderParameter是,可以是一個自定義類型充滿了可以從源IQueryable實例推斷的任何信息。

有什麼想法?

+0

你能舉一個例子說明你究竟將查詢轉化爲什麼?包含lambda表達式的LINQ方法調用代碼? –

+0

我已經添加了一個例子。希望它有助於理解這個問題。 – Mac

+0

我想''String.Contains()'',''String.StartsWith()''和''String.EndsWith()''在你的場景中是不夠的嗎? –

回答

0

使用lambda和正則表達式將是交叉提供者和更少的代碼混亂。