2011-09-04 86 views
0

我有出现语法正确以下select语句:如何使用LINQ/Linq2E返回具体类型的新对象?

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); 

然而,这将引发:我已经尝试添加一个“建设者”类返回一个新的ImporterAccount

Only parameterless constructors and initializers are supported in LINQ to Entities. 

,但这太失败了,这次使用:

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异常?

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

回答

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)时,总是发生这种情况的另一个场景是 ,您将在迭代中触发延迟加载以加载实体。

+0

谢谢,但是我得到“已经有一个打开的DataReader与此命令关联,必须先关闭”? – BlueChippy

+0

这似乎是一个单独的问题。我编辑了我的答案,并提供了一个可能的解决方案的链接。 –

+0

收到你的答案,虽然我实际上首先将所有内容都返回到anonymouse类型,然后从中选择以解决第二个问题(这是延迟加载和多个结果集) – BlueChippy

相关问题