Превратите очень простое выражение <Func <T, bool >> в выражение SQL, где - PullRequest
1 голос
/ 14 апреля 2009

У меня есть несколько различных источников данных, к которым мне нужно обращаться, и я смог ограничить все свои запросы очень простыми выражениями, состоящими не более чем из двух условий. Пример типичной сложности моих выражений lamba:

b => b.user == "joe" && b.domain == "bloggs.com"

На моих источниках данных, отличных от SQL, я в порядке, поскольку могу преобразовать их в списки объектов и использовать запрос LINQ, например:

public override T Get(List<T> assets, Expression<Func<T, bool>> whereClause)
{
    return assets.Where(a => whereClause.Compile()(a)).FirstOrDefault();
}

Моя проблема в том, что когда мне нужно запросить реляционную базу данных - меня действительно интересуют только Postgresql и MySQL - я немного боролся. У меня есть nHibernate, чтобы Linq «работал», но были некоторые проблемы, из-за которых он зависает и прекращает доступ к базе данных или не может закрывать соединения, типичные вещи, которые можно ожидать от чего-то в бета-версии, поэтому я не жалуюсь.

Поскольку мои запросы настолько просты, и я рад сам создавать SQL, я хотел бы знать, есть ли относительно безболезненный способ превращения моих выражений в предложения SQL где?

Я быстро обыскал и нашел несколько примеров, и, конечно, уже есть некоторые механизмы Linq-to-SQL, так что я знаю, что это можно сделать. Вопрос в том, могу ли я что-то сделать за день или меньше усилий? Это то, что, по моим оценкам, потребуется, чтобы найти совместимую библиотеку Linq-to-SQL и загрузить ее, если все будет хорошо. У меня есть серьезные соображения по поводу производительности, поэтому для меня предпочтительнее использовать сырой SQL, а не работать через ORM.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2009

Исходя из вашего комментария о том, что вы хотите построить только предложение SQL WHERE из своей лямбды, давайте посмотрим на предложение WHERE. Я буду использовать его в контексте полной инструкции SELECt, но то же самое для обновления и удаления.

Пример

SELECT * FROM b
WHERE b.user == 'joe' AND b.domain == 'bloggs.com'

Как видите, будет очень легко построить предложение where:

Я так понимаю, что b - это имя таблицы. Вам нужно только:

  • отрезать все до и включая оператор "=>"
  • изменить все операторы с лямбда на синтаксис SQL: '==' становится '='.
  • изменить '&&' на AND и '||' ИЛИ
  • соответственно изменить апострофы ("-> ') в строковых операциях.

Вы можете использовать скобки для группировки вашей логики. Используйте LIKE, чтобы найти подстроки в строках. Посмотрите на этот сайт для синтаксиса предложения where.

Для замены магии используйте замену строки:

str = str.Replace("==", "=");
0 голосов
/ 14 апреля 2009

Написание поставщика LINQ может быть очень трудным. Я бы предложил посмотреть по этим ссылкам:

Поставщик Linq для MySql, Postgres, Oracle (Это с открытым исходным кодом)
Написание собственного провайдера LINQ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...