지형 공간 데이터 원본을 쿼리하기 위해 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
인스턴스에서 유추 할 수있는 모든 정보로 채워집니다.
아이디어가 있으십니까?
검색어를 정확히 변환하는 예를 들어 주시겠습니까? 람다와 함께 LINQ 메서드 호출을 포함하는 코드? –
예제를 추가했습니다. 그것이 그 질문을 이해하는 데 도움이되기를 바랍니다. – Mac
''String.Contains()'',''String.StartsWith()''및''String.EndsWith()''가 시나리오에서 충분하지 않다고 가정합니다. –