c # Свободный помощник SQL - улучшение синтаксиса - PullRequest
2 голосов
/ 29 января 2011

Я пишу небольшую библиотеку, чтобы помочь в построении запросов SQL (в настоящее время я выполняю только SELECT), но меня не устраивает аспект синтаксиса, вот пример для объяснения:

var db = FluentDb.WithConnectionString("SqlCeTest");

var query = db.From("Customers")
              .Where(FS.Col("Age") > 18 & FS.Col("Name").StartsWith("L"))
              .OrderBy("BirthDate")
              .Select("Name", "Age", "BirthDate");

var customers = query.ToList((r) => new
                             {
                                 Name = r.Get<string>("Name"),
                                 Age = r.Get<int>("Age"),
                                 BirthDate = r.Get<DateTime?>("BirtDate")
                             });

Часть, которую я хотел бы улучшить, это FS.Col("ColumnName"), она должна обозначать FluentSql.Column (возвращать новый FluentColumn (columnName)), но я нахожу это немного длинным в этом контексте, что мне действительно нравитсядолжен быть в состоянии использовать только Col("ColumnName") ...

Кто-нибудь видит трюк, который я мог бы использовать, чтобы достичь этого, или другую идею синтаксиса?

Мои идеи:

  • Метод расширения для строки: Where("Name".Col() == "Jon")
  • Лямбда-выражение с фабричным объектом с использованием индексатора: .Where(c => c["Name"] == "Jon")

Кто-нибудь видит что-то лучше / короче / лучше?

Редактировать:

моя вторая идея выглядит хорошо, но есть и обратная сторона, если я использую ее в другом контексте: мне иногда нужно использовать FluentColumns в операторах Select (или OrderBy, или GroupBy)вот так:

query.Select(FS.Col("Name").As("Customer"), FS.Col("OrderId").Count().As("OrdersCount"));

Я должен был бы повторить 'c =>' fили каждый столбец ...

Ответы [ 2 ]

0 голосов
/ 07 февраля 2011

Просто для информации, я решил использовать синтаксис индексатора для экземпляра FluentDb:

db["Customer", "AddressId"] средний столбец AddressId таблицы Customer,

доступен альтернативный синтаксис: db["Customer"]["AddressId"]

Итак, в конце концов, это будет (мне все еще нужно найти хитрость, чтобы сделать объявление Column без таблицы хорошим):

.Where(db["Customer", "Name"] == "Jon")
0 голосов
/ 29 января 2011

Поворотом вашего второго варианта (что довольно неплохо) будет использование динамического объекта расширения в лямбда-выражении вместо строкового индексатора. http://blogs.msdn.com/b/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-the-expandoobject.aspx

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