为什么EF无法解析Linq to Sql可以成功解析的表达式

时间:2017-11-17 14:36:10

标签: c# entity-framework

TL; DR; - 为什么在Entity Framework中删除了某些投影和表达式解析功能?如果EF是未来支持的框架,我很惊讶看到功能已被移除。

我正在从Linq2Sql迁移到Entity Framework,我发现的主要挑战都是Linq to Entities和Expression Parser。

例如,在Linq To Sql中,我可以运行一个直接投影到对象构造函数的查询:

db.Table.Select(x=>new KeyValuePair<int,string>(x.Id,x.Name)).ToList();

然而,在EntityFramework中,这会抛出一个错误:Only parameterless constructors and initializers are supported in LINQ to Entities.而是我必须执行以下两个选项之一,其中(1)加载整个实体,并且价格昂贵,或者(2)是冗长的而不是一个干净的代码实践(IMO)。

1: db.Table.AsEnumerable()
    .Select(x=>new KeyValuePair<int,string>(x.Id,x.Name))
    .ToList()
2: db.Table
    .Select(x=>new{x.Id, x.Name})
    .AsEnumerable()
    .Select(x=>new KeyValuePair<int,string>(x.Id,x.Name))
    .ToList();

我完全理解EF不能将C#代码发送到SQL服务器,但不知何故,L2S足够聪明地解析表达式,并处理SQL端的select和C#端的投影。

有任何变通方法吗?我知道LinqKit和AsExpandable()能够解决其中的一些限制,但我还没有找到一个清晰的解决方案来解决之前的问题。

0 个答案:

没有答案