2011-11-23 56 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和正则表达式将是交叉提供者和更少的代码混乱。