2012-10-17 40 views
1

我對我的某些類型使用Dapper擴展,它對大多數使用情況非常適用。我碰到的,我有一個多對多的關係的情況下,我想要做的事,如: -使用Dapper擴展定製SQL

SELECT id,a,b,c FROM Foo WHERE Foo.id in (SELECT foo_id FROM foo-bar WHERE [email protected]_id) 

顯然小巧玲瓏的擴展能夠處理「選擇ID,A,B,C來自富」,但而不是後者。我可以做一個選擇來獲取我想要的Foo ID列表,然後將其傳遞給Dapper Extensions,但效率較低。

我不能用普通小巧玲瓏做的部分是自動獲取SELECT列的列表,所以我很想一個辦法: -

  • 獲得從小巧玲瓏的擴展的內部的SELECT列列表機制
  • 獲取基本的「選擇ID,A,b,C來自富」,從小巧精緻的擴展的內部機制
  • 掛鉤小巧玲瓏的擴展獲取代碼,這樣我可以添加自定義WHERE子句

我已經看過代碼,但是我不知道如何去做這些事情。誰能幫忙?我目前通過使用普通的Dapper和「SELECT * ...」來解決問題,但我確信有更好的方法。

回答

1

我不知道這在2012年還沒有得到支持。所以兩年內約1.7K的觀點並沒有太多的曝光。但是如果有人新來到Dapper登陸這裏,並想知道它是否有效,答案是,它正在工作。使用最新版本,截至撰寫本文時,Dapper v1.42 from nuget

var sql = "SELECT id,a,b,c FROM Foo WHERE Foo.id in (
    SELECT foo_id FROM foo-bar WHERE [email protected]_id)" 
using (var cn = new SqlConnection(the_connection_string)) { 
    cn.Open(); 
    var returnedObject = cn.Query<dynamic>(sql, new { bar_id = some_value }); 
} 
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)