Używam Dapper Extensions dla niektórych moich typów i działa naprawdę dobrze w większości przypadków użycia. Wpadłem na przypadek, w którym mam związek wiele-wiele i chcę zrobić coś takiego:-

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

Oczywiście rozszerzenia Dapper mogą obsłużyć "SELECT id,a,b,c FROM Foo", ale nie drugą część. Mógłbym wybrać, aby uzyskać listę identyfikatorów Foo, których chcę, a następnie przekazać ją do Dapper Extensions, ale jest to mniej wydajne.

Częścią, której nie mogę zrobić ze zwykłym Dapperem, jest automatyczne pobranie listy kolumn SELECT, więc to, co naprawdę chciałbym, to sposób: -

  • Pobierz listę kolumn SELECT z wewnętrznych mechanizmów Dapper Extension
  • Pobierz podstawowe „SELECT id,a,b,c FROM Foo” z wewnętrznych mechanizmów Dapper Extension
  • Hook Dapper Extensions Uzyskaj kod, aby dodać niestandardową klauzulę WHERE

Spojrzałem na kod, ale nie widzę, jak wykonać te rzeczy. Czy ktoś może pomóc? Pracowałem nad tym, używając zwykłego Dappera i "SELECT * ...", ale jestem pewien, że jest lepszy sposób.

1
JohnCC 17 październik 2012, 12:56

2 odpowiedzi

Najlepsza odpowiedź

Nie wiedziałem, że nie było to obsługiwane w 2012 roku. Więc około 1,7 tys. wyświetleń w ciągu dwóch lat i niewielka ekspozycja. Ale na wypadek, gdyby ktoś nowy w Dapper wylądował tutaj i zastanawiał się, czy to działa, odpowiedź brzmi: działa. Używając najnowszej wersji, w chwili pisania tego tekstu, Dapper v1.42 z 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 });
}
1
von v. 8 lipiec 2015, 05:03

Oto inna opcja:

Możesz utworzyć widok:

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

Następnie użyj predykatów, aby wybrać z dowolną klauzulą ​​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();
}

Wygenerowany SQL powinien wyglądać mniej więcej tak:

SELECT 
   [Foo].[foo_id]
 , [Foo].[...]
 , [Foo].[...]
 , [Foo].[...]
 , [Foo].[...] 
FROM [ViewName] 
WHERE ([ViewName].[foo_id] = @foo_id_0)
2
Void Ray 17 październik 2012, 21:06