c#Fluent SQL Helper - 语法改进

时间:2011-01-29 19:37:54

标签: c# linq syntax

我正在编写一个小库来帮助构建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")
  • 使用索引器的工厂对象的Lambda表达式:.Where(c => c["Name"] == "Jon")

有人看到更好/更短/更好的东西吗?

修改

我的第二个想法看起来不错但是如果我在另一个背景下使用它有一个缺点: 我有时需要在Select(或OrderBy或GroupBy)语句中使用FluentColumns:

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

我必须重复'c =&gt; '对于每一栏......

2 个答案:

答案 0 :(得分:0)

第二个选项(非常好)的一个转折就是在lambda中使用动态expandoobject而不是字符串索引器。 http://blogs.msdn.com/b/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-the-expandoobject.aspx

答案 1 :(得分:0)

仅供参考,我决定在FluentDb实例上使用索引器语法:

db["Customer", "AddressId"]表示表Customer的AddressId,

提供了另一种语法:db["Customer"]["AddressId"]

所以最后,它会(我仍然需要找到一个技巧来制作没有表的列声明):

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