使用Dapper在Query <object>中自定义选择项目

时间:2016-01-08 12:42:22

标签: dapper

我是Dapper的新人。 我想从conn.Query&lt;&gt;()中选择动态项,它在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

在实体框架中,我可以通过以下代码解决我的问题:

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

1 个答案:

答案 0 :(得分:0)

如果问题只是选择两列,那么在最简单的层面上,你可以完全按照你已经做的那样做,即

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

请注意,此 将所有列提取回客户端,然后重新映射到那里。如果您想在服务器上进行列过滤,那么您需要使用类似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和非通用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);