LINQ реализация LIKE для нескольких поставщиков LINQ - PullRequest
1 голос
/ 23 ноября 2011

Я пытаюсь разработать реализацию стандарта .NET ( OGC 04-095 для тех, кто интересуется), который определяет язык на основе XML для запроса источника геопространственных данных.Мне доставляет удовольствие (правда) перевод этих запросов в выражения LINQ, чтобы я мог практически получить доступ к любому источнику (конечно, при условии, что для него есть поставщик LINQ).

Как требование, я долженреализовать оператор 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 экземпляра.

Есть идеи?

1 Ответ

0 голосов
/ 04 января 2012

Использование лямбда-выражения и регулярных выражений приведет к кросс-провайдеру и уменьшит помехи в коде.

...