Any*_*are 4 .net c# asp.net orm dapper
当我尝试执行此方法时,出现以下异常:
使用多重映射API时,如果您拥有ID以外的其他键,请确保设置splitOn参数
public static IEnumerable<FinancePositionList> GetFinancialListsForConsecutiveYears(int year, int periodTypeId, int period)
{
IEnumerable<FinancePositionList> resultList;
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Finance"].ConnectionString))
{
conn.Open();
StringBuilder query = new StringBuilder();
query.Append("SELECT b.CompanyId,b.CompanyName,[Year]");
query.Append(",CreationDate,AccruedExpenses,AdvancePaymentsToContractors");
query.Append("FROM finance.FinanceList a INNER JOIN finance.Company b ");
query.Append("ON a.CompanyId = b.CompanyId ");
query.Append("INNER JOIN finance.ListPeriod c ");
query.Append("ON c.FinanceListId = a.FinanceListId ");
query.Append("WHERE Discriminator = " + "'" + "FinancePositionList" + "' ");
query.Append("AND[Year] IN @years ");
query.Append("AND c.PeriodTypeId = @PeriodTypeId AND c.Period = @Period ");
query.Append("ORDER BY b.CompanyId, a.[Year] DESC ");
resultList = conn.Query<FinancePositionList, Company,ListPeriod, FinancePositionList>(query.ToString(),
(a, b,c) =>
{
a.Company = b;
c.FinanceList = a;
return a;
},
new
{
years = new[] { year, year - 1 },
PeriodTypeId = periodTypeId,
Period = period
},
splitOn: "CompanyId,FinanceListId").AsEnumerable();
}
return resultList;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我现在通过更改像这样的列顺序来解决此问题:但是我想知道是否可以对代码进行更多增强?
public static IEnumerable<FinancePositionList> GetFinancialListsForConsecutiveYears(int year, int periodTypeId, int period)
{
IEnumerable<FinancePositionList> resultList;
using (var conn = new SqlConnection(ResolveConnectionString()))
{
conn.Open();
StringBuilder query = new StringBuilder();
query.Append("SELECT CreationDate,AccruedExpenses,AdvancePaymentsToContractors,[Year]");
query.Append(",b.CompanyId,b.CompanyName,c.FinanceListId ");
query.Append("FROM finance.FinanceList a INNER JOIN finance.Company b ");
query.Append("ON a.CompanyId = b.CompanyId ");
query.Append("INNER JOIN finance.ListPeriod c ");
query.Append("ON c.FinanceListId = a.FinanceListId ");
query.Append("WHERE Discriminator = " + "'" + "FinancePositionList" + "' ");
query.Append("AND [Year] IN @years ");
query.Append("AND c.PeriodTypeId = @PeriodTypeId AND c.Period = @Period ");
query.Append("ORDER BY b.CompanyId, a.[Year] DESC ");
resultList = conn.Query<FinancePositionList, Company, ListPeriod, FinancePositionList>(query.ToString(),
(a, b, c) =>
{
a.Company = b;
a.CompanyId = b.CompanyId;
a.FinanceListId = c.FinanceListId;
return a;
},
new
{
years = new[] { year, year - 1 },
PeriodTypeId = periodTypeId,
Period = period
},
splitOn: "CompanyId,FinanceListId").AsEnumerable();
}
return resultList;
}
Run Code Online (Sandbox Code Playgroud)
您大多数人误解了Multimappingusing 的工作方式Dapper,您的查询产生了以下列:
**"CompanyId","CompanyName","Year","CreationDate","AccruedExpenses",
"AdvancePaymentsToContractors"**
Run Code Online (Sandbox Code Playgroud)
现在,在multimapping代码中,以下是Query您正在调用的dapper 重载(从中检查source code):
public static IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TReturn>(
this IDbConnection cnn, string sql, Func<TFirst, TSecond, TThird, TReturn> map,
object param, IDbTransaction transaction, bool buffered, string splitOn,
int? commandTimeout, CommandType? commandType)
Run Code Online (Sandbox Code Playgroud)
之前我误解了整个调用,但是现在看来,问题只在于使用SplitOn的Multi映射类型映射,您已经对其进行了更正,因此,只要spliton查询结果中提供了正确的列,以下操作就可以了
conn.Query<FinancePositionList, Company,ListPeriod, FinancePositionList>(query.ToString(), (a, b,c) =>
{
a.Company = b;
c.FinanceList = a;
return a;
},
new
{
years = new[] { year, year - 1 },
PeriodTypeId = periodTypeId,
Period = period
}, splitOn: "CompanyId,FinanceListId")
Run Code Online (Sandbox Code Playgroud)
现在,只有一点需要澄清,因为我已经在评论中发布了years参数的integer array工作原理,该参数主要是an ,对于所有文本的当前查询来说,这都可以正常工作,但是对于stored procedures,它希望使用相同DataTable,与集合相同的列的顺序和名称只能使用来提供Table Valued Parameters。我不希望对当前用例进行任何其他更改。
编辑以提供匿名参数和动态参数的示例:
匿名参数
C#中的这种简单匿名类型,请在此处检查,想法是您可以使用简单的占位符提供所有参数,例如{max = <value>,min=<value>},即使名称匹配{max,min},也可以按原样提供,在两种情况下参数均为@maxand @min,大小写无关紧要,请使用 AnonymousParametersin您的参数代码years, PeriodTypeId, Period,它将在内部推导类型和其他详细信息,并假定所有都是输入参数
{years = new[] { year, year - 1 },PeriodTypeId = periodTypeId,Period = period}
Run Code Online (Sandbox Code Playgroud)
动态参数
它们更像是Ado.Net中的Parameter类,可让您显式添加参数,以下是Dapper代码中的重载,您必须Type, Direction显式提供诸如etc等的所有信息(dapper源代码中的代码段):
public partial class DynamicParameters : SqlMapper.IDynamicParameters, SqlMapper.IParameterLookup, SqlMapper.IParameterCallbacks
{
public void Add(string name, object value, DbType? dbType, ParameterDirection? direction, int? size)
public void Add(string name, object value = null, DbType? dbType = null, ParameterDirection? direction = null, int? size = null, byte? precision = null, byte? scale = null)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7130 次 |
| 最近记录: |