2017-03-05 52 views
1

我需要在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:方法的Int16 GetSignByEntityType(System.String, Enka.Gfs.Domain.SharedEntities.Request.InvoiceReportType)「沒有 支持轉換爲SQL。

我該如何解決這個問題?

+2

如果您使用的是純LINQ,但您使用的是EntityFramework/Linq-to-SQL,則可以這樣做。它試圖在SQL服務器上執行你的函數,這顯然不知道'GetSignByEntityType()'的意思。 – AndrewP

回答

0

不幸的是,這不能以這種方式完成。你基本上試圖在SQL服務器上運行你自定義的C#函數,這是行不通的。解決這個問題的一種方法是在你的SQL服務器上編寫一個SQL存儲過程,然後使用C#中的實體框架調用該存儲過程。

本文檔可能會有幫助:http://www.entityframeworktutorial.net/stored-procedure-in-entity-framework.aspx

+0

你爲什麼說「可悲」? – Enigmativity

+0

如果你可以在SQL服務器上執行C#代碼作爲存儲過程,那將是非常好的,但這需要一種以非常複雜的方式在C#和SQL之間進行轉換的方法。實體框架不會做那樣的事情,它可能不是真的可能。 –

0

有兩種方式實現自己的任務,首先你可以使用存儲過程和創建你的函數對數據庫端執行。二是創建一個SQL視圖(使用SQL視圖是很好的解釋here

無論哪種方式,你最好調用是你的C#代碼轉換成SQL查詢和執行它們形成數據庫端,並取回處理的數據集。

相關問題