首页 > 解决方案 > linq 选择中的功能

问题描述

我有这个错误:

LINQ to Entities 无法识别该方法:GetDebitOuCredit

当我运行这个:

using (SXEntities db = new SXEntities())
{
    result = from ecriture in db.Ecrits
             join compte in db.Comptes on ecriture.Compte equals compte.Compte1
             join societe in db.Societes on ecriture.Societe equals societe.Societe1                             
             select new EcritDTO
             {
                 LibelleElement = compte.Libelle,
                 LienGED = string.Empty, // WIP
                 Compte = ecriture.Compte,
                 Collectif = ecriture.RacColtif,
                 Date = ecriture.DateC,
                 Journal = ecriture.Journal,
                 Piece = ecriture.Piece,
                 CodeOperation = ecriture.CodeOpe,
                 Libelle = ecriture.Libelle,
                 ReferenceDocument = ecriture.DocuRef,
                 // Error just below
                 Debit = GetDebitOuCredit("Debit", societe.DCMoins, ecriture.MtDeb, ecriture.MtCre),
             };
}

我不能使用这个功能:

public double GetDebitOuCredit(string choix, string dcMoins, double? montantDebit, double? montantCredit)
{
    double debit = 0;
    double credit = 0;
    bool isMontantNegatif = string.IsNullOrEmpty(dcMoins) && dcMoins == "1";

    if(montantDebit != null && montantDebit != 0 && montantCredit != null && montantCredit != 0)
    {
        double difference = (double)montantDebit - (double)montantCredit;

        if(difference < 0 && isMontantNegatif)
        {
            debit = 0;
            credit = Math.Abs(difference);
        }
        else
        {
            debit = difference;
            credit = 0;
        }
    }

    return choix == "Debit" ? debit : credit;
}        

我的问题:如何将我的函数转换GetDebitOrCredit为 LINQ 表达式?

标签: c#entity-frameworklinqexpression

解决方案


实际上,如果是最终投影,则不必翻译此功能。如果没有,您必须为此使用第三方扩展:

https://github.com/hazzik/DelegateDecompiler

https://github.com/axelheer/nein-linq/

从未尝试过DelegateDecompiler,因此将显示示例使用NeinLinq

[InjectLambda]
public double GetDebitOuCredit(string choix, string dcMoins, double? montantDebit, double? montantCredit)
{
   _getDebitOuCreditFunc ??= GetDebitOuCredit().Compile();
   return _getDebitOuCreditFunc(choix, dcMoins, montantDebit, montantCredit);
}

static Func<string, string, double?, double?, double> _getDebitOuCreditFunc;

public static Expression<Func<string, string, double?, double?, double>> GetDebitOuCredit()
{
    return (choix, dcMoins, montantDebit, montantCredit) =>
       montantDebit != null && montantDebit != 0 && montantCredit != null && montantCredit != 0) 
       ? ((double)montantDebit < (double)montantCredit) && dcMoins == "1" 
          ? choix == "Debit" ? 0 : (double)montantCredit) - (double)montantDebit
          : choix == "Debit" ? (double)montantDebit - (double)montantCredit) : 0
        : 0;
}

然后,您可以在调用后在 LINQ 查询中使用您的函数ToInjectable()

result = from ecriture in db.Ecrits.ToInjectable()
         join compte in db.Comptes on ecriture.Compte equals compte.Compte1
         ...
                             

推荐阅读