我有一个返回(除其他外)UUID 的函数。我正在使用 FluentMap 处理一些包含空格的返回列,但有问题的列 ( invoice_id
) 没有这个问题。
db 查询的缩写版本:
CREATE FUNCTION fnSearchInvoices (
_SearchTerm TEXT
)
RETURNS TABLE(
store_id INTEGER,
customer_id TEXT,
"Customer Name" TEXT,
"Store Name" TEXT,
"Email" TEXT,
invoice_id UUID
) AS $$
SELECT
I.store_id,
I.customer_id,
C.name AS "Customer Name",
S.name AS "Store Name",
C.email AS "Email",
I.id AS invoice_id
FROM Invoice I
JOIN Customer C
ON I.customer_id = C.id
JOIN Store S
ON I.store_id = S.id
WHERE
{bunch of conditions for matching search term}
;
$$ LANGUAGE SQL;
请求类:
public class SearchRequest
{
public string SearchTerm { get; set; }
public int PagingOffSet { get; set; }
public int PageSize { get; set; }
public string SortField { get; set; }
public string SortDirection { get; set; }
}
结果类:
public class SearchResult
{
public int StoreID { get; set; }
public string CustomerID { get; set; }
public string CustomerName { get; set; }
public string StoreName { get; set; }
public string Email { get; set; }
public string InvoiceID { get; set; }
public int TotalRecords { get; set; }
}
实体地图:
public class SearchResultMap : EntityMap<SearchResult>
{
public SearchResultMap()
{
Map(p => p.CustomerID).ToColumn("Customer Name");
Map(p => p.StoreName).ToColumn("Store Name");
}
}
最后,从 C# 调用数据库:
IDbConnection dbConnection = new NpgsqlConnection(strDbConnectionString)
string strCommand = "SELECT *, count(*) OVER() AS total_records ";
strCommand += "FROM fnSearchInvoices(:SearchTerm) ";
strCommand += "ORDER BY \"" + cSearchRequest.SortField + "\" " + cSearchRequest.SortDirection + " ";
strCommand += "LIMIT :PageSize OFFSET :PagingOffSet;";
cSearchResponseList = dbConnection.Query<T>(strCommand, cSearchRequest).ToList();
当我使用异常处理运行上面的代码时,我收到以下错误(这是一条异常消息加上内部消息):
Error: Error parsing column 6 (invoice_id=12345678-abcd-1234-abcd-1234567890ef - Object) Details: System.InvalidCastException: Object must implement IConvertible. at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) at Deserializeabcdef12-abcd-1234-abcd-abcdef123456(IDataReader )
我可以InvoiceID
从SearchResponse
班级中删除并且查询工作正常;它忽略了该列,其他所有内容都按预期映射。
db 函数正在其他地方使用,我宁愿不更改它,尽管作为最后的手段,我可以在函数中进行转换。它只需要在我正在处理的范围之外的其他地方进行额外的更改。而且我意识到我应该能够SELECT
在我的 C# 中通过按名称而不是 * 获取所有列来将 UUID 显式转换为函数调用之外的 TEXT,我将在接下来尝试。但是为了将来参考,有没有办法让 Dapper 正确地将查询返回的 UUID 映射到 C# 字符串?