使用Dapper Extensions自定义SQL

c# dapper micro-orm orm

我正在为我的一些类型使用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 Extensions可以处理“SELECT id,a,b,c FROM Foo”,但不能处理后者。我可以选择获取我想要的Foo id列表,然后将其传递给Dapper Extensions,但效率较低。

我不能用普通Dapper做的部分是自动获取SELECT列列表,所以我真正想要的是一种方法: -

  • 从Dapper Extension的内部机制中获取SELECT列列表
  • 从Dapper Extension的内部机制中获取基本的“SELECT id,a,b,c FROM Foo”
  • Hook Dapper Extensions获取代码,以便我可以添加自定义WHERE子句

我看过代码,但我无法发现如何做这些事情。有人可以帮忙吗?我目前使用普通的Dapper和“SELECT * ...”来解决这个问题,但我确信有更好的方法。

一般承认的答案

我不知道这在2012年没有得到支持。所以两年内大约1.7K的观点并没有多少曝光。但是,如果Dapper的新人登陆这里并想知道它是否有效,答案是,它正在发挥作用。使用最新版本,在撰写本文时, 来自nuget的Dapper v1.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 });
}

热门答案

这是另一种选择:

您可以创建一个视图:

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
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因