我目前正在使用查询 8 次Query<>(8 次是因为我必须将一些列转换为 JSON,有时是单独的)来生成所需的完整结果集。但是,我想知道是否可以通过使用QueryMultiple. 我有一个假设QueryMultiple可以同时查询所有这些表,因此我不必等待每个查询完成。
我还有另一种选择。它是*Async方法的使用版本。
QueryMutiple但是,如果不显着更改代码,我就无法实现。我应该使用常规方法QueryMutiple还是*Async常规方法的版本?两种替代方案之间的权衡是什么?我应该使用哪一种?
我正在尝试从数据库获取索引碎片信息。
这里是简洁的 sql 查询:
var result = await _dbConnection.QueryAsync<IndexFragmentationModel>($@"
select
a.index_id as Id, name as Name, avg_fragmentation_in_percent as FragmentationPercent
from sys.dm_db_index_physical_stats (DB_ID(N'@dbName'), OBJECT_ID(N'@tableName'), null, null, null) as a
join sys.indexes as b on a.object_id = b.object_id and a.index_id = b.index_id;
", new
{
dbName = dbName,
tableName = tableName
});
return result.ToList();
Run Code Online (Sandbox Code Playgroud)
参数没有传递到预期的位置。
有人可以建议吗 - 也许还有另一种方法可以通过它们?
我的存储过程SQL语句非常简单。
Delete From TableName where ID IN (@id)
Run Code Online (Sandbox Code Playgroud)
我想从 C# 代码传递列表或数组,并希望返回已删除的行数。
下面是我的代码,不知怎的,我不相信并认为这不是正确的方法。这样做的有效方法是什么?
using (SqlConnection connection = new SqlConnection(_connectionString))
{
await connection.OpenAsync();
DynamicParameters parameters = new DynamicParameters();
foreach (var id in ids)
{
parameters.Add("@Id", id, DbType.Int32, ParameterDirection.Input);
await connection.ExecuteAsync(
ProcedureNames.DeleteRules,
parameters,
commandType: CommandType.StoredProcedure);
}
}
Run Code Online (Sandbox Code Playgroud) QueryFirstOrDefault<T>在 Dapper 中,和的用法有什么区别ExecuteScalar<T>?
两者似乎都返回单个值,但QueryFirstOrDefault<T>如果未找到,则会返回该类型的默认值。由于性能或其他原因,您是否应该始终更喜欢使用两者之一,或者它们是否等效,而忽略返回的默认值?
我使用 Dapper 库。我有一个动态查询,它从 QueryMultiple 方法返回一个或多个结果集/表。我没有任何具体的结果集数量可以写。Read() 方法的。我们是否有任何函数或方法(例如 result.Count = 返回表的数量)或有多少个。我们可以编写 read() 来检索 N 次。结果集?
SqlMapper.GridReader result = _connection.QueryMultipleAsync(model.APIName, oPara, commandType: CommandType.StoredProcedure).Result;
dynamic dyn = result.Read();
Run Code Online (Sandbox Code Playgroud) 当我使用 Dapper 插入、更新或删除实体时,我需要返回id实体的。
我正在使用这段代码:
var role = await roleConnection.ExecuteAsync("UPDATE Role SET IsDelete = @isDelete, RoleName = @roleName, SecurityStamp = @securityStamp WHERE Role.Id = @id SELECT SELECT CAST(SCOPE_IDENTITY() AS INT)"
, new
{
isDelete = request.IsDelete = false,
roleName = request.RoleName,
securityStamp = Guid.NewGuid(),
id = request.Id
});
Run Code Online (Sandbox Code Playgroud)
但它没有向我显示任何内容。
我怎样才能做到这一点?
使用 Parallel.ForEach 时,将任何 DB 或 Api 调用转换为异步方法是否会提高性能?
一些背景知识,我目前有一个控制台应用程序,它按顺序循环访问一堆文件,并为每个文件调用一个 API 并进行一些数据库调用。主要逻辑如下:
foreach (file in files)
{
ReadTheFileAndComputeAFewThings(file);
CallAWebService(file);
MakeAFewDbCalls(file);
}
Run Code Online (Sandbox Code Playgroud)
目前,所有数据库和 Web 服务调用都是同步的。
Parallel.ForEach正如您所期望的那样,更改要使用的循环给我带来了巨大的性能提升。
我想知道是否将调用保留Parallel.ForEach在那里,并在循环内将所有 Web 服务调用更改为异步(例如,HttpClient.SendAsync)并将 DB 调用更改为异步(使用 Dapper,db.ExecuteAsync()) - 这是否会通过允许它来提高应用程序的性能重用线程?或者它实际上什么都不做,因为Parallel.ForEach无论如何都会处理线程分配?
对于 PostgreSQL 中的表的查询,我能够正确获取数据。
var query = "Select Id,name from employee
where
joiningTime BETWEEN '{startDateTime:yyyy-MM-dd HH:mm:ss}' AND '{endDateTime:yyyy-MM-dd HH:mm:ss}'"
Run Code Online (Sandbox Code Playgroud)
数据返回正确,但由于这种方法容易发生 SQL 注入,我想将其更改为参数化方式
var query = "Select Id,name from employee
where
joiningTime BETWEEN '@startDateTime' AND '@endDateTime'"
var result = dbConnection.Query<Result>(query, new {startDateTime, endDateTime });
Run Code Online (Sandbox Code Playgroud)
怎么还能带参数传递格式呢?
我有一个 SQL 表“国家”,其中包含 CountryId 和 StateId。StateId 可以为 null,因为并非所有国家/地区都有州。我想检查表中是否存在国家/州的组合。如果表中的国家/地区为“NL”且州为 NULL,并且我使用以下查询,其中countryId =“NL”且 stateId = null:
return await conn.ExecuteScalarAsync<bool>(@"SELECT COUNT(*)
FROM [dbo].[Countries]
WHERE [CountryId] = @CountryId
AND [StateId] = @StateId",
new { countryId, stateId });
Run Code Online (Sandbox Code Playgroud)
它将返回 false。我期待一个真实的回应。有人可以解释这种行为以及解决此问题的最佳方法是什么吗?
我正在使用 Dapper 从数据库中查询单个列。列内容是 Json 字符串。我想直接给它消毒。我的代码看起来像这样
string sql =@"SELECT [col1] FROM [table] where col3=@col3"
var data= await _connection.QuerySingleOrDefaultAsync<mymodelclass>(sql, parameters);
Run Code Online (Sandbox Code Playgroud)
一切对我来说看起来都不错,但这只给出了空的对象。我的模型类结构
public class mymodelclass
{
public string LevelTwo { get; set; }
public string LevelThree { get; set; }
public string LevelFour { get; set; }
public string LevelFive { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
第 1 栏内容
{
"LevelTwo": "05 Planning, Budgeting and Forecasting",
"LevelThree": "5A Planning, Budgeting and Forecasting",
"LevelFour": "5A.07 Prepare Forecasts, Finalize Presentations / Reports",
"LevelFive": "zxczx",
}
Run Code Online (Sandbox Code Playgroud) c# ×10
dapper ×10
.net ×1
asp.net ×1
asp.net-core ×1
asp.net-mvc ×1
httpclient ×1
postgresql ×1
sql-server ×1
task ×1