Настройка SQL с расширениями Dapper

c# dapper micro-orm orm

Вопрос

Я использую расширения Dapper для некоторых из моих типов, и он работает очень хорошо для большинства случаев использования. Я столкнулся с ситуацией, когда у меня много отношений, и я хочу сделать что-то вроде:

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 id, который я хочу, а затем передать это Dapper Extensions, но это менее эффективно.

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

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

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

Принятый ответ

Я не знал, что это не было поддержано еще в 2012 году. Так что около 1.7K просмотров через два года и мало внимания. Но в случае, если кто-то новый для Даппера приземлился здесь и задается вопросом, работает ли он, ответ заключается в том, что он работает. Используя последнюю версию, начиная с этой записи, 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
Является ли этот КБ законным? Да, узнайте, почему