使用 Dapper 在 Query<object> 中自定义 select 项

Custom select items in Query<object> using Dapper

我是 Dapper 的新手。 我想 select 来自 conn.Query<>() 的动态项,它在 SQL.

中执行存储过程

我的代码类似于:

            connection.Open();
            var parameters = new DynamicParameters();
            parameters.Add("@name", x.GetValue<string>("Name"));
            parameters.Add("@lastname", x.GetValue<string>("LastName"));
            var query = connection.Query<Costumer>(sql: "GetCostumer", param: parameters, commandType: CommandType.StoredProcedure);

我的存储过程类似于:

select * from Costumer where name = @Name and lastname = @lastname

在 entity framework 中,我可以通过以下代码解决我的问题:

IQueryable<User> query = container.GetQuery<Users>();
var finalResult = (from item in query
              select new {
                  item.name,
                  item.lastname
              }).ToList();

如果问题是关于只选择两列,那么在最简单的级别上,您可以完全按照您已经在做的去做,即

var finalResult = (from item in query
                  select new {
                      item.Name,
                      item.LastName
                  }).ToList();

请注意,此 将所有列取回客户端,然后 re-maps 在那里。如果你想在服务器上进行列过滤,那么你需要使用类似 INSERT EXEC 的东西和随后的 SELECT,即

DECLARE @table_var TABLE (cols)
INSERT INTO @table_var (cols) EXEC proc {args}
SELECT foo, bar FROM @table_var

虽然更清晰的实现可能是公开一个 UDF - 然后您可以只使用:

SELECT foo, bar FROM dbo.SomeFunction(args);

顺便说一句,如果 <Costumer> 类型不存在,可以通过 dynamic 和 non-generic Query 来避免中间类型方法,但实际上比上面的方法效率略低,所以应该谨慎使用。

另请注意,在这种情况下您不需要 DynamicParameters;你可以只使用:

var parameters = new {
    name = x.GetValue<string>("Name"),
    lastname = x.GetValue<string>("LastName")
};
var query = connection.Query<Costumer>("GetCostumer", parameters,
    commandType: CommandType.StoredProcedure);