Dapper拡張機能によるSQLのカスタマイズ

c# dapper micro-orm orm

質問

私はいくつかの種類のDapper Extensionsを使用しています。ほとんどの使用例ではうまく機能します。私はたくさんの関係を持っていますが、私は次のようなことをしたいと思います。

SELECT id,a,b,c FROM Foo WHERE Foo.id in (SELECT foo_id FROM foo-bar WHERE bar-id=@bar_id)

明らかに、Dapper Extensionsは "SELECT id、a、b、c FROM Foo"を処理できますが、後者の部分は処理できません。私はFoo IDのリストを取得し、それをDapper Extensionsに渡すことができますが、効率が悪いです。

プレーンなDapperで行うことができない部分は自動的にSELECTカラムリストを取得するので、私が本当に好きなのは次のようなものです:

  • Dapper Extensionの内部メカニズムからSELECTカラムのリストを取得する
  • Dapper Extensionの内部メカニズムから基本的な "SELECT id、a、b、c FROM Foo"を取得する
  • Hook Dapper ExtensionsカスタムWHERE句を追加できるようにコードを取得する

私はコードを見てきましたが、私はこれらのことをする方法を見つけることができません。誰も助けることができますか?私は単純なDapperと "SELECT * ..."を現時点で使っていますが、もっと良い方法があると確信しています。

受け入れられた回答

私はこれが2012年にサポートされていなかったことを知らなかった。しかしDapperの新しい人がここに着陸し、それがうまくいくかどうか疑問に思うなら、答えは働いているということです。この記事の執筆時点で、最新バージョンのDapper v1.42をnugetから使用しています:

var sql = "SELECT id,a,b,c FROM Foo WHERE Foo.id in (
    SELECT foo_id FROM foo-bar WHERE bar-id=@bar_id)"
using (var cn = new SqlConnection(the_connection_string)) {
  cn.Open();
  var returnedObject = cn.Query<dynamic>(sql, new { bar_id = some_value });
}

人気のある回答

別のオプションがあります:

ビューを作成することができます:

select * from Foo 
join FooBar b
on a.foo_id = b.foo_id

次に、述部を使用してwhere句を選択します。

using (SqlConnection cn = new SqlConnection(_connectionString))
{
    cn.Open();
    var predicate = Predicates.Field<Foo>(f => f.foo_id, Operator.Eq, 1);
    IEnumerable<Foo> list = cn.GetList<Foo>(predicate);
    cn.Close();
}

生成されるSQLは次のようになります。

SELECT 
   [Foo].[foo_id]
 , [Foo].[...]
 , [Foo].[...]
 , [Foo].[...]
 , [Foo].[...] 
FROM [ViewName] 
WHERE ([ViewName].[foo_id] = @foo_id_0)


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow