开发者

c# Fluent SQL Helper - Syntax improvement

开发者 https://www.devze.com 2023-02-07 05:13 出处:网络
I\'m writing a little library to help building SQL requests (only doing SELECTs for the moment) but I\'m not satisfied with an aspect of the syntax, here\'s an exemple to explain:

I'm writing a little library to help building SQL requests (only doing SELECTs for the moment) but I'm not satisfied with an aspect of the syntax, here's an exemple to explain:

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")
                             });

The part I'd like to improve is the FS.Col("ColumnName"), it's supposed to stand for FluentSql.Column (return a new FluentColumn(columnName)), but I find it a bit long in that context, what I'd really like is to be able to use just Col("ColumnName")...

Do anybody see a trick I could use to achieve that, or another syntax idea?

My ideas:

  • Extension method on string: Where("Name".Col() == "Jon")
  • Lambda expression with factory object using indexer: .Where(c => c["Name"] == "Jon")

Anyone see something better/shorter/nicer?

Edit:

my second idea looks good but there's a downside if i use it in another context: I sometime need to use FluentColumns in Select (or OrderBy, or GroupBy) statem开发者_开发知识库ents like that:

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

I would have to repeat the 'c => ' for each column...


A twist on your second option (which is pretty good) would be to use a dynamic expandoobject in the lambda instead of a string indexer. http://blogs.msdn.com/b/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-the-expandoobject.aspx


Just for information, I decided to go with an indexer syntax on the FluentDb instance:

db["Customer", "AddressId"] mean column AddressId of table Customer,

an alternative syntax is available: db["Customer"]["AddressId"]

So in the end, it's gonna be (I still need to find a trick to make the Column declaration without table nice):

.Where(db["Customer", "Name"] == "Jon")
0

精彩评论

暂无评论...
验证码 换一张
取 消