DapperExtensions Generic<T> 使用来自 SeparateModels 的谓词填充模型
DapperExtensions Generic<T> Populate Model using Predicates from SeparateModels
我正在开发一个利用 Dapper、DapperExtensions 使用通用模型的项目,我想知道如何使用 DapperExtension.GetAll 方法填充模型?
下面是 sql 代码,returns 我尝试使用 DapperExtensions 过滤记录。
select f.*
from Item f
where f.CurrentStatus = 'Open'
AND f.ItemID not in (SELECT ItemID FROM ItemLog l WHERE f.ItemID = l.ItemID
AND l.Status != 'Escalated'
AND DateLogged <= DATEADD(mi, 25, GetDate())) //<- this value would be replaced with a variable
我做了一些研究,发现您可以使用 Split.on 但不确定在这种情况下是否合适
GetAll 方法看起来像这样,所以我们确实能够过滤记录
public virtual IEnumerable<TModel> GetAll(IList<DbFilter<TModel>> filters = null)
{
filters = filters ?? new List<DbFilter<TModel>>();
using (var db = Context)
{
var pg = new PredicateGroup { Operator = GroupOperator.And, Predicates = new List<IPredicate>() };
foreach (var filter in filters)
{
pg.Predicates.Add(Predicates.Field(filter.FilterExpression, filter.FilterOperator, filter.FilterItem));
}
return db.GetList<TModel>(pg).ToList();
}
}
如有任何帮助,我们将不胜感激。我考虑过创建一个 SPROC 来填充模型的想法。只是想确定最有效的路线。
好吧,我设法使用以下方法填充了我的模型,仍然希望听到反馈或可能的建议。
public async Task<IEnumerable<FormsFnol>> GetLateItems(DateTime responseTime)
{
IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
var items = await db.QueryAsync<FormsFnol>(@"
SELECT f.*
FROM Item f
WHERE f.CurrentStatus = 'Open'
AND f.ItemID not in (SELECT ItemID FROM ItemLog l WHERE f.ItemID = l.ItemID
AND l.Status != 'Escalated'
AND DateLogged <= @dateTime
", new { @dateTime = responseTime});
return items;
}
我猜我会使用我的答案,因为我没有收到任何正面或负面的反馈
public async Task<IEnumerable<FormsFnol>> GetLateItems(DateTime responseTime)
{
IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
var items = await db.QueryAsync<FormsFnol>(@"
SELECT f.*
FROM Item f
WHERE f.CurrentStatus = 'Open'
AND f.ItemID not in (SELECT ItemID FROM ItemLog l WHERE f.ItemID = l.ItemID
AND l.Status != 'Escalated'
AND DateLogged <= @dateTime
", new { @dateTime = responseTime});
return items;
}
Dapper Extensions 不支持存储过程,但 Dapper 支持。
对于您的代码,SP 看起来像这样:
result = dbConnection.Query<FormsFnol>("FormsFnol_s",
new { dateTime = responseTime},
null,
true,
null,
CommandType.StoredProcedure);
您的存储过程将执行代码中的 select 查询。我会出于一个非常简单的原因使用存储过程:如果您需要更改 selection 方法,在 Sql 中更改它比更改程序本身要容易得多。
我自己一直在远离 DapperExtensions,因为缺乏关于它如何使用的文档,而且它确实有一段时间没有更新了。
我正在开发一个利用 Dapper、DapperExtensions 使用通用模型的项目,我想知道如何使用 DapperExtension.GetAll 方法填充模型?
下面是 sql 代码,returns 我尝试使用 DapperExtensions 过滤记录。
select f.*
from Item f
where f.CurrentStatus = 'Open'
AND f.ItemID not in (SELECT ItemID FROM ItemLog l WHERE f.ItemID = l.ItemID
AND l.Status != 'Escalated'
AND DateLogged <= DATEADD(mi, 25, GetDate())) //<- this value would be replaced with a variable
我做了一些研究,发现您可以使用 Split.on 但不确定在这种情况下是否合适
GetAll 方法看起来像这样,所以我们确实能够过滤记录
public virtual IEnumerable<TModel> GetAll(IList<DbFilter<TModel>> filters = null)
{
filters = filters ?? new List<DbFilter<TModel>>();
using (var db = Context)
{
var pg = new PredicateGroup { Operator = GroupOperator.And, Predicates = new List<IPredicate>() };
foreach (var filter in filters)
{
pg.Predicates.Add(Predicates.Field(filter.FilterExpression, filter.FilterOperator, filter.FilterItem));
}
return db.GetList<TModel>(pg).ToList();
}
}
如有任何帮助,我们将不胜感激。我考虑过创建一个 SPROC 来填充模型的想法。只是想确定最有效的路线。
好吧,我设法使用以下方法填充了我的模型,仍然希望听到反馈或可能的建议。
public async Task<IEnumerable<FormsFnol>> GetLateItems(DateTime responseTime)
{
IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
var items = await db.QueryAsync<FormsFnol>(@"
SELECT f.*
FROM Item f
WHERE f.CurrentStatus = 'Open'
AND f.ItemID not in (SELECT ItemID FROM ItemLog l WHERE f.ItemID = l.ItemID
AND l.Status != 'Escalated'
AND DateLogged <= @dateTime
", new { @dateTime = responseTime});
return items;
}
我猜我会使用我的答案,因为我没有收到任何正面或负面的反馈
public async Task<IEnumerable<FormsFnol>> GetLateItems(DateTime responseTime)
{
IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
var items = await db.QueryAsync<FormsFnol>(@"
SELECT f.*
FROM Item f
WHERE f.CurrentStatus = 'Open'
AND f.ItemID not in (SELECT ItemID FROM ItemLog l WHERE f.ItemID = l.ItemID
AND l.Status != 'Escalated'
AND DateLogged <= @dateTime
", new { @dateTime = responseTime});
return items;
}
Dapper Extensions 不支持存储过程,但 Dapper 支持。
对于您的代码,SP 看起来像这样:
result = dbConnection.Query<FormsFnol>("FormsFnol_s",
new { dateTime = responseTime},
null,
true,
null,
CommandType.StoredProcedure);
您的存储过程将执行代码中的 select 查询。我会出于一个非常简单的原因使用存储过程:如果您需要更改 selection 方法,在 Sql 中更改它比更改程序本身要容易得多。
我自己一直在远离 DapperExtensions,因为缺乏关于它如何使用的文档,而且它确实有一段时间没有更新了。