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()''在你的场景中是不够的吗? –