.Distinct() 和 .ToList() 不适用于 Dapper Multi Map 内部服务方法



>我正在使用Dapper Multi Mapping返回发票集合。每张发票都包含一组发票项。以下是模型。

public class InvoiceModel
{
public int InvoiceId { get; set; }
public string CustomerName { get; set; }
public List<InvoiceItemModel> InvoiceItems { get; set; }
}
public class InvoiceItemModel
{
public int InvoiceItemId { get; set; }
public int InvoiceId { get; set; }
public string ItemName { get; set; }
public int Quantity { get; set; }
}

我发现如果我放置代码以获取数据并直接在控制器中映射对象,那么一切正常。但是,我想将此代码放入从控制器调用的服务中。当我将代码放在服务中时,代码不起作用。事实上,我什至不能在作为服务一部分的方法中使用 lambda 扩展Distinct()ToList()

此代码有效- 注意它在 API 控制器中的位置

public List<InvoiceModel> GetInvoiceTest(int invoiceId)
{
using (IDbConnection db = new System.Data.SqlClient.SqlConnection(SqlDataAccess.LoadConnectionString("InvoiceDb")))
{
try
{
string sql = @"SELECT 
Invoice.InvoiceId,
Invoice.Customer AS CustomerName,
InvoiceItem.InvoiceItemId,
InvoiceItem.InvoiceId,
InvoiceItem.[Name] AS ItemName,
InvoiceItem.Quantity
FROM Invoice
LEFT JOIN InvoiceItem ON Invoice.InvoiceId = InvoiceItem.InvoiceId
WHERE Invoice.InvoiceId = " + invoiceId;
var invoiceDictionary = new Dictionary<int, InvoiceModel>();
var invoices = db.Query<InvoiceModel, InvoiceItemModel, InvoiceModel>(
sql,
(invoiceModel, invoiceItemModel) =>
{
InvoiceModel invoiceEntry;
if (!invoiceDictionary.TryGetValue(invoiceModel.InvoiceId, out invoiceEntry))
{
invoiceEntry = invoiceModel;
invoiceEntry.InvoiceItems = new List<InvoiceItemModel>();
invoiceDictionary.Add(invoiceEntry.InvoiceId, invoiceEntry);
}
invoiceEntry.InvoiceItems.Add(invoiceItemModel);
return invoiceEntry;
},
splitOn: "InvoiceItemId").Distinct().ToList();
return invoices;
}
catch (Exception ex)
{
Log.Error("", "Get Invoice Error", new { InvoiceId = invoiceId }, ex);
throw new Exception("Error occured while trying to obtain Invoice", ex);
}
}
}

但是,如果我将相同的代码放在服务类中包含的静态方法中,我发现我无法使用.Distinct().ToList();。我发现我可以将扩展名更改为.AsList();但结果是重复的。

这是服务中的方法。

public static List<InvoiceModel> GetInvoices(int invoiceId)
{
using (...)
{
// Same code as above starting with the using statement
...
//splitOn: "InvoiceItemId").Distinct().ToList(); // Unavailable
splitOn: "InvoiceItemId").AsList(); // Only option available
}
}

它与static的服务方法有关吗?

注意:对于帖子的长度,我深表歉意。我尝试尽可能多地配对它,但我觉得最好列出模型。

尝试这些行

var invoices = db.QueryAsync<InvoiceModel, InvoiceItemModel, InvoiceModel>(
sql,
(invoiceModel, invoiceItemModel) =>
{
InvoiceModel invoiceEntry;
if (!invoiceDictionary.TryGetValue(invoiceModel.InvoiceId, out invoiceEntry))
{
invoiceEntry = invoiceModel;
invoiceEntry.InvoiceItems = new List<InvoiceItemModel>();
invoiceDictionary.Add(invoiceEntry.InvoiceId, invoiceEntry);
}
invoiceEntry.InvoiceItems.Add(invoiceItemModel);
return invoiceEntry;
},
null,
null,
true,
splitOn: "InvoiceItemId",
999)
.Result
.Distinct()
.ToList();

谢谢

最新更新