c# - 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 表达式?
解决方案
实际上,如果是最终投影,则不必翻译此功能。如果没有,您必须为此使用第三方扩展:
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
...
推荐阅读
- class - 如何在使用 pyknow 开发基于知识的系统中调用要由 tkinter 按钮执行的类对象
- java - Selenium Java WebDriverWait - 无法访问 java.util.function
- java - 用于读取 bean 的 Java 代理
- visual-studio-code - VSCODE:无法读取未定义的属性“本地”
- node.js - 当我使用 console.log 缓冲区时,VS Code 自动将十六进制更改为十进制
- python - 获取 127.0.1.1 而不是 192.168.1.* ip ubuntu python
- c++ - C++/CLI 本机类中的函数是否编译为 MSIL 或本机 x64 机器代码?
- angular - 无法从控制器动态禁用 FormArray(Angular 5)
- arduino - 如何解决这个错误“avrdude: error reading signature data, rc=-67”?
- jquery - 创建外部数据表按钮