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

时间:2011-09-04 09:01:24

标签: c# linq-to-entities

我有以下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.

我尝试添加一个“构建器”类来返回一个新的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异常?

如何返回新对象并对其进行计算?

1 个答案:

答案 0 :(得分:0)

我不确定您的问题的解决方案是什么,但您可以解决这个问题:

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: 关于“关闭现有数据读取器错误”,A google search returns many results,第一个是SO question。接受的答案是:

  

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