我是Dapper的新人。我想从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
在实体框架中,我可以通过以下代码解决我的问题:
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();
请注意,这不取所有列返回给客户机,然后重新映射在那里。如果你想在服务器上进行列过滤,那么你需要使用类似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);