Настройка SQL с помощью расширений Dapper

Я использую 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 могут обрабатывать «SELECT id, a, b, c FROM Foo», но не последнюю часть. Я мог бы сделать выбор, чтобы получить список идентификаторов Foo, которые мне нужны, а затем передать его в Dapper Extensions, но это менее эффективно.

Часть, которую я не могу сделать с простым Dapper, - это автоматически получить список столбцов SELECT, поэтому мне действительно нужен способ: -

  • Получите список столбцов SELECT из внутренних механизмов расширения Dapper.
  • Получите базовый «SELECT id,a,b,c FROM Foo» из внутренних механизмов Dapper Extension.
  • Hook Dapper Extensions Получить код, чтобы я мог добавить пользовательское предложение WHERE

Я просмотрел код, но не могу понять, как это сделать. Кто-нибудь может помочь? На данный момент я работал, используя простой Dapper и "SELECT *...", но я уверен, что есть лучший способ.


person JohnCC    schedule 17.10.2012    source источник


Ответы (2)


Я не знал, что это не поддерживалось еще в 2012 году. Итак, около 1,7 тыс. просмотров за два года и не так много показов. Но на случай, если кто-то новичок в 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 });
}
person von v.    schedule 08.07.2015

Вот еще один вариант:

Вы можете создать представление:

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)
person Void Ray    schedule 17.10.2012