2017-03-05 8 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#でEntity Frameworkを使用してそのストアドプロシージャを呼び出す方法です。

このドキュメントは助けることがあります。まず、あなたがストアドプロシージャを使用して、DB側で実行するために、あなたの関数を作成することができ、あなたのタスクを達成するための2つの方法がありますhttp://www.entityframeworktutorial.net/stored-procedure-in-entity-framework.aspx

+0

なぜ「悲しい」と言いますか? – Enigmativity

+0

ストアドプロシージャとしてSQL Server上でC#コードを実行できるのであればうれしいことですが、それはC#とSQLの間を非常に複雑な方法で変換する方法を必要とします。 Entity Frameworkはそういうことをしませんし、実際には不可能かもしれません。 –

0

。 2番目は、SQLビューを作成する(非常によく説明されています)

どちらの方法でも、C#コードをSQLクエリに変換してデータベース側から実行し、処理済みのデータセットを取得することが最善の方法です。

関連する問題