Я пытаюсь разработать реализацию стандарта .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
экземпляра.
Есть идеи?