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
實例推斷的任何信息。
有什麼想法?
你能舉一個例子說明你究竟將查詢轉化爲什麼?包含lambda表達式的LINQ方法調用代碼? –
我已經添加了一個例子。希望它有助於理解這個問題。 – Mac
我想''String.Contains()'',''String.StartsWith()''和''String.EndsWith()''在你的場景中是不夠的嗎? –