1

私はいくつかのタイプにDapperExtensionsを使用していますが、ほとんどのユースケースで非常にうまく機能します。私は多対多の関係を持っているケースに遭遇しました、そして私は次のようなことをしたいです:-

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

明らかに、DapperExtensionsは「SELECTid、a、b、c FROM Foo」を処理できますが、後者の部分は処理できません。選択して必要なFooIDのリストを取得し、それをDapper Extensionsに渡すこともできますが、効率は低下します。

プレーンなDapperで実行できない部分は、SELECT列リストを自動的に取得することです。したがって、私が本当に望んでいるのは、次の方法です。-

  • DapperExtensionの内部メカニズムからSELECT列リストを取得します
  • DapperExtensionの内部メカニズムから基本的な「SELECTid、a、b、cFROMFoo」を取得します
  • Hook Dapper ExtensionsカスタムWHERE句を追加できるように、コードを取得します

私はコードを見ましたが、これらのことを行う方法を見つけることができません。誰か助けてもらえますか?現時点では、プレーンなDapperと「SELECT * ...」を使用して回避しましたが、もっと良い方法があると確信しています。

4

2 に答える 2

2

別のオプションは次のとおりです。

ビューを作成できます。

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)
于 2012-10-17T17:06:43.870 に答える
1

これが2012年にサポートされていなかったことを私は知りませんでした。したがって、2年間で約1.7Kのビューがあり、露出はそれほど多くありません。しかし、Dapperに不慣れな人がここに着陸し、それが機能するかどうか疑問に思った場合、答えは、機能しているということです。この記事の執筆時点で、nugetのDapperv1.42の最新バージョンを使用しています。

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 });
}
于 2015-07-08T02:03:31.933 に答える