2010-12-14 15 views
0

これは非常に単純なlinqプロバイダーで、小さな制約のドメイン内のオブジェクトを処理しています。 Linq2Sqlが完全に実装されている必要はありませんが、SQLクエリーが必要です。なぜなら、テーブルとカラムの名前を見ると、ほとんどのexpression tree => sqlは非常に(非常に)一般的でなければならないということでした。ExpressiontreeからSQLへの一般的な解析

Expression<Func<DateTime, bool>> expr = d => d.DateTime.Month == 1 

は常に

{0} IS NOT NULL OR {0} = NOW() 

DATEPART({0}, m) = 1 

または

Expression<Func<DateTime?, bool>> expr = d => d.HasValue || d == DateTime.Now 

に変換されます、あなたがポイントを得る願っています。このようなジェネリックSQLジェネレータはありますか?

+0

Linq2SQLを使用しない理由がわかりません。 – VVS

+0

しかし、1つの重要な問題は、実行時にテーブルと列の名前を知ることができないので、Linq2Sqlに渡すdbmlスキーマを作成する方法はありません –

+0

明白なあなたは見なければならない点がないからです。私は特定のドメインの問題を解決する方法を尋ねることはありません。それはかなりうまく動いていて、OrderByメソッドのような単純なものに対して表現木を喜んで使用しているからです。私はちょっと神経質だけど、彼らは任意の複合体を得ることができるので、SQLに解析するためのホイールを作り直すことは、とにかくそれほど汎用的であれば、ほとんどの場合ばかげているようだ。 –

答えて

0
+0

実際に私はIQueryable Toolkitについて知っています。私は式からsqlを出すことができるはずのSqlFormatterクラスを見ています。たぶん私はソースを取得し、それがORMの機能にあるすべての依存関係を削除し、自分のコードで使用する必要があります。 –

1

hehe、私たちはちょうど周囲をハッキングしませんか?ですから、まだ完全には動作していないので、マッピング情報を動的に注入する方法を理解する必要がありますが、これまでのところは有望です。

私は再びそれについて私に思い出させるためのダミアンのおかげで、このコードIQToolkitを使用して

var provider = new DbEntityProvider(new SqlConnection(), new TSqlLanguage(), new ImplicitMapping(), new QueryPolicy()); 
var exp = provider.GetTable<Hey>().Where(d => d.Born.Month == 1 || (!String.IsNullOrEmpty(d.Yo) && d.Born == DateTime.Now)).Expression; 
var sql = ((QueryProvider)provider).GetQueryText(exp); 

で、このSQL

SELECT t0.[Born], t0.[Yo] 
FROM [Heies] AS t0 
WHERE ((MONTH(t0.[Born]) = 1) OR (NOT (t0.[Yo] IS NULL OR t0.[Yo] = '') AND (t0. 
[Born] = @p0))) 

を生成することができたので、きました!誰かがLinq2Sql経由でSQLを生成する同様の方法を持っている場合、私はあなたから聞いて欲しいので、IQToolkitへの依存を緩めることができます。私は、各パラメータの値を抽出する時に壁にヒットしている浮気をたくさんした後

更新

。多くのソースを読んだら、それは実際のクエリの実行のために遠くに隠されているようです。ので、多分私はちょうどその

var xml = Generate<NewsProperty>(); 
var mapping = XmlMappingSource.FromUrl(xml); 
var ctx = new DataContext(new SqlConnection("..."), mapping); 

var query = ctx.GetTable<NewsProperty>().Where(n => n.Date.Year == 2010).OrderBy(n => n.Date).Take(5); 
var cmd = ctx.GetCommand(query); 
string sql = cmd.CommandText; 

foreach (DbParameter param in cmd.Parameters) 
{ 
    sql = sql.Replace(param.ParameterName, param.Value.ToString()); 
} 
に固執する必要があり、私は大体同じことをこのコードを思い付い/

Linq2Sqlに見た後:まあ、私は、クエリが実行されないようにするものを、推測