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()能够解决其中的一些限制,但我还没有找到一个清晰的解决方案来解决之前的问题。