我需要在linq中编写一个自定义函数。
private short GetSignByEntityType(string entityType, InvoiceReportType invoiceReportType)
{
if (invoiceReportType == InvoiceReportType.WithholdingTaxReport)
{
if (entityType == "R") return 1;
if (entityType == "I") return -1;
}
return this._sign;
}
var headerDataWithBook1Rates = (
from hd in headerDataToUse
from vi in voucherItems.Where(x => x.VoucherID == hd.VoucherID && x.Sign == GetSignByEntityType(hd.EntityType, request.ReportType)).DefaultIfEmpty()
from dvi in draftVoucherItems.Where(x => x.DraftVoucherID == -hd.VoucherID && x.Sign == GetSignByEntityType(hd.EntityType, request.ReportType)).DefaultIfEmpty()
from vacc in accounts.Where(x => x.ID == vi.AccountID).DefaultIfEmpty()
from dvacc in accounts.Where(x => x.ID == dvi.AccountID).DefaultIfEmpty()
.....
它给了我一个错误。
System.NotSupportedException:Method'Int16 GetSignByEntityType(System.String, Enka.Gfs.Domain.SharedEntities.Request.InvoiceReportType)'没有 支持转换为SQL。
我该如何解决这个问题?
答案 0 :(得分:0)
可悲的是,这不能以这种方式完成。您实际上是在SQL服务器上运行自定义C#函数,这将无法正常工作。一种可以解决此问题的方法是在SQL服务器上编写一个SQL存储过程,它可以执行您想要的操作,然后使用C#中的实体框架调用该存储过程。
此文档可能有所帮助:http://www.entityframeworktutorial.net/stored-procedure-in-entity-framework.aspx
答案 1 :(得分:0)
有两种方法可以实现您的任务,首先,您可以使用存储过程并创建要在数据库端执行的函数。第二是创建一个sql视图(使用sql视图很好地解释了here)
无论哪种方式,最好的方法是将c#代码转换为sql查询并从数据库端执行它们并获取已处理的数据集。