如何在linq子句中编写自定义函数

时间:2017-03-05 22:55:33

标签: c# linq

我需要在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。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

可悲的是,这不能以这种方式完成。您实际上是在SQL服务器上运行自定义C#函数,这将无法正常工作。一种可以解决此问题的方法是在SQL服务器上编写一个SQL存储过程,它可以执行您想要的操作,然后使用C#中的实体框架调用该存储过程。

此文档可能有所帮助:http://www.entityframeworktutorial.net/stored-procedure-in-entity-framework.aspx

答案 1 :(得分:0)

有两种方法可以实现您的任务,首先,您可以使用存储过程并创建要在数据库端执行的函数。第二是创建一个sql视图(使用sql视图很好地解释了here

无论哪种方式,最好的方法是将c#代码转换为sql查询并从数据库端执行它们并获取已处理的数据集。