使用 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);
我是 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);