1

我正在为我的某些类型使用 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 * ...”来解决问题,但我确信有更好的方法。

4

2 回答 2

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)
于 2012-10-17T17:06:43.870 回答
1

我不知道这在 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 });
}
于 2015-07-08T02:03:31.933 回答