2011-01-29 6 views
2

私はSQLリクエストを作成するのに役立つ小さなライブラリを作成していますが(瞬間的にSELECTを行っています)、構文の一面に満足していません。説明する例があります:c#Fluent SQL Helper - 構文の改善

私は改善したい
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") 
          }); 

の部分は、FluentSql.Column用スタンド(新FluentColumn(COLUMNNAME)を返す)ことになっています、FS.Col("ColumnName")ですが、私は「何、そのコンテキストで少し長いそれを見つけます本当に好きなのはCol("ColumnName")です...

私はそれを達成するために使うことができるトリックや別の構文を見ていますか?

私のアイデア:文字列の

  • 拡張方法:Where("Name".Col() == "Jon")
  • インデクサを使用してファクトリオブジェクトを持つラムダ式:​​

誰でも短い/よりよい/より良いものを参照してください?

編集:

私の第二の考えはよさそうだが、私は別のコンテキストでそれを使用する場合の欠点があります: 私はいつかを選択(または[並べ替え、またはGROUPBY)そのような文でFluentColumnsを使用する必要があります。

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

私が繰り返さなければならないであろう「C =>」各列のために...

+0

あなたの2番目のアプローチは非常に自然で、あなたの図書館のユーザーは、「魔法を理解する」ことなく、何をしているのかを理解することができます。 –

+0

実際に私は質問を書くときにアイデアを持っていましたが、おそらくそれを実装するでしょうが、より良い解決策を求めて傷つけることはできません:) – Guillaume86

答えて

0

だけの情報について、私はFluentDbインスタンス上のインデクサ構文で行くことにしました最終的には、それが実現するでしょう(私はテーブルを素敵にしなくてもColumn宣言をするにはまだトリックを見つける必要があります):

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

(かなり良いです)、あなたの目のオプションのねじれは、動的expandoobjectを使用することです文字列インデクサーの代わりにラムダで使用します。

代替構文が利用可能である、

db["Customer", "AddressId"]テーブルカスタマーの列のAddressIdを意味:db["Customer"]["AddressId"]

http://blogs.msdn.com/b/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-the-expandoobject.aspx

+0

それは良い考えですが、列名をパラメトリックにします(しかし、別のlibは既にDBアクセスのためのダイナミックな使い方をしています:Simple.Data) – Guillaume86