2011-11-23 1 views
1

지형 공간 데이터 원본을 쿼리하기 위해 XML 기반 언어를 정의하는 표준 인 .NET 구현 (해당 사용자의 경우 OGC 04-095)을 개발하려고합니다. 나는 재미있게 (사실) 이러한 쿼리를 LINQ 표현식으로 변환하여 모든 종류의 소스에 액세스 할 수 있도록했습니다 (물론 LINQ 공급자가 제공되는 경우).여러 LINQ 공급자에서 LINQ LIKE 구현

필요에 따라 LIKE 연산자를 구현해야합니다. SqlMethods.Like 메서드를 사용할 수는 있지만 SQL 데이터 소스로 제한됩니다. 문제는 다른 공급 업체에서 작동 할 수있는 구현이 가능한가하는 점입니다. 내가 지금 생각하고있는 어떤

은 다음과 같습니다 공급자가 LINQ는 SQL이다

  • 경우 (쿼리가 데이터베이스에서 실행할 수 있도록)는 SqlMethods.Like 방법을 사용합니다.
  • 그렇지 않은 경우 메모리에서 실행되도록 내 사이트를 제공하십시오.

물론이 시나리오는 LINQ식이 실행될 공급자 유형을 검색 할 수있는 경우에만 가능합니다. 이것이 가능한지 나는 모른다.

<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가 될 수있는 사용자 정의 유형입니다

예를 들어, 다음과 같은 XML 입력 쿼리의 일부가 될 것입니다 소스 IQueryable 인스턴스에서 유추 할 수있는 모든 정보로 채워집니다.

아이디어가 있으십니까?

+0

검색어를 정확히 변환하는 예를 들어 주시겠습니까? 람다와 함께 LINQ 메서드 호출을 포함하는 코드? –

+0

예제를 추가했습니다. 그것이 그 질문을 이해하는 데 도움이되기를 바랍니다. – Mac

+0

''String.Contains()'',''String.StartsWith()''및''String.EndsWith()''가 시나리오에서 충분하지 않다고 가정합니다. –

답변

0

람다와 정규 표현식을 사용하면 크로스 제공자가되고 코드 혼잡은 줄어 듭니다.