如何使用LINQ/Linq2E返回一个具体类型的新对象

本文关键字:类型 对象 新对象 一个 LINQ 何使用 Linq2E 返回 | 更新日期: 2023-09-27 18:07:33

我有以下语法正确的select语句:

 var accounts = from i in db.IRSBASEFLs
                           join vr in db.VSARules on i.VSACode equals vr.VSACode into rules
                           from rule in rules.DefaultIfEmpty()
                           select new ImporterAccount(i, rule, RuleType.Liquidity);
但是,这会抛出:
Only parameterless constructors and initializers are supported in LINQ to Entities.

我试过添加一个"builder"类来返回一个新的ImporterAccount,但这也失败了,这次是:

LINQ to Entities does not recognize the method 'IrsalDAL.ImporterAccount CreateImporterAccount(IrsalDAL.IRSBASEFL, IrsalDAL.VSARule, IrsalUtilities.RuleType)' method, and this method cannot be translated into a store expression.

我需要执行计算,理想情况下在构造函数中,所以我有点困惑,如何实现这一点?

当类不是我的实体模型的一部分时,为什么会抛出L2E异常?

如何返回一个新对象并在其上执行计算?

如何使用LINQ/Linq2E返回一个具体类型的新对象

我不确定你的问题的解决方案是什么,但你可以围绕它工作:

var tempAccounts = from i in db.IRSBASEFLs
                   join vr in db.VSARules on i.VSACode equals vr.VSACode into rules
                   from rule in rules.DefaultIfEmpty()
                   select new { VarI = i, Rule = rule, Liquidity = RuleType.Liquidity};
var accounts = tempAccounts.Select(x => new ImporterAccount(x.VarI, x.rule, x.Liquidity));

希望能有所帮助:)

编辑1:关于"关闭现有数据阅读器错误",谷歌搜索返回许多结果,第一个是SO问题。公认的答案是:

这不是关于关闭连接。EF正确管理连接。我对这个问题的理解是有多个数据在单个连接(或单个命令)上执行的检索命令使用多个选择),而下一个DataReader在第一个之前执行一个人完成了阅读。避免异常的唯一方法是允许多个嵌套的datarereader =打开MultipleActiveResultSets。这种情况经常发生的另一种情况是当你迭代查询的结果(IQueryable),你会在迭代中触发被加载实体的延迟加载。