2009-04-14 9 views
1

私はクエリに必要な数多くの異なるデータソースを持っており、すべてのクエリを2条件以下の非常に単純な式に限定することができました。私のラムダ式の典型的な複雑さの例は次のとおりです。非常に単純な式<Func <T, bool>>をSQL where句

public override T Get(List<T> assets, Expression<Func<T, bool>> whereClause) 
{ 
    return assets.Where(a => whereClause.Compile()(a)).FirstOrDefault(); 
} 
:私の非SQLデータソースに

b => b.user == "joe" && b.domain == "bloggs.com" 

私はリストをオブジェクトとのようなLINQクエリを使用するためにそれらを変換することができますよう、OKですよ

私の問題は、リレーショナルデータベースを照会する必要があるときです。私はPostgreSQLとMySQLに本当に関心があります。少し苦労しました。私はLinqにnHibernateを持っていますが、データベースへのアクセスが停止したり、接続を閉じることができないいくつかの問題を抱えています。

私のクエリはとても簡単で、自分でSQLを構築することができて幸せです。

私は素早く検索していくつかのサンプルを見つけましたが、もちろんLinq-to-SQLエンジンもいくつかあります。質問は、それが1日以内に取り組むことができるかどうかです。それは互換性のあるLinq-to-SQLライブラリを見つけて、それが正常に動作していると仮定して負荷テストをすると私は見積もっています。私は大きなパフォーマンスの考慮事項を持っているので、生のSQLはORMを実行するのではなく、私にとって優先されます。

+0

あなたはLINQプロバイダを構築したいか、単にSQL WHERE句にラムダを変換しますか? –

+0

単純なwhere節を作成したいだけです。私はそれが重大な仕事だと知っているLINQプロバイダを構築したくありません。 – sipwiz

答えて

0

LINQプロバイダの作成は、非常にとなります。私はこれらのリンクを検討してお勧めします:あなただけのラムダからの句は、してみましょうSQLを構築したいあなたのコメントに基づいて

Linq Provider for MySql, Postgres, Oracle(これはオープンソースである)
Writing custom LINQ provider

+0

私はDbLinqを見ていましたが、別のライブラリを接続してパフォーマンスや信頼性の問題にぶつからないことに少し気をつけます。それでもnHibernateよりもかなり軽く見えるので、結局少し時間を投資する価値があるかもしれません。 – sipwiz

+0

うわー、DbLinqは時代遅れです。 –

0

WHERE句を見てください。私は完全なSELECtステートメントのコンテキストでそれを使用しますが、更新と削除についても同じです。

SELECT * FROM b 
WHERE b.user == 'joe' AND b.domain == 'bloggs.com' 

あなたが見ることができるように、WHERE句を構築することは非常に容易になります。

私はbがテーブルの名前であることをそれを取ります。 「==」「=」次のようになります。ラムダからのSQL構文へのすべての演算子は「=>」演算子を含む前と すべてを遮断し

  • 変更:あなたは、その後だけにしています。
  • 'AND'と '||'に '& &'を変更します。 OR
  • 変更アポストロフィに応じて(」 - >「)文字列操作で

あなたがグループにあなたのロジックを括弧を使用することができます使用LIKEは、文字列内の部分文字列を見つけることの構文についてはthis siteを見てください。。。 where節。

使用した文字列は、魔法を行うに置き換えます

str = str.Replace("==", "="); 
+0

それは私が避けたいと思っている道であり、それは実際に私がどこから移ったのかです。 Linqについての私の状況の良い点は、私がb.LastUpdate> DateTime.Nowを行うことができることです。日付のToStringを行うprobsはありませんが、私は文字列でDateTime.Nowを一致させることを開始した場合、それは乱雑になるだろう:(。 – sipwiz

関連する問題