我正在尝试处理实体框架,并且要求通过距离地球上的点的距离来订购结果。我决定previous advice使用我已成功填充视图的存储过程来执行此操作。但是我需要返回多个表,我知道我无法直接使用Entity Framework上的存储过程。如果这不正确,如果有人能告诉我如何做到这一点,我将不胜感激。
无论如何我因此定义了一个简单的sp(SELECT id FROM table
),然后想要执行linq查询以将其与模型中的等效对象连接,如下所示:
var sp = db.StoredProcedure();
var ret = from x in db.X
join y in sp on x.ID equals y.ID
select x;
但是当我执行此操作时,我得到了以下由查询引起的异常:
“无法创建类型'System.Collections.Generic.IEnumerable'1'的常量值。在此上下文中仅支持原始类型('如Int32,String,Guid'。”
为什么会这样?这是正确的方法吗? (请注意,我的最终sp会更复杂,我将从“select
”中的ret
返回多个类
答案 0 :(得分:3)
EF中非常支持存储过程。即使它们返回实体结果,它们也不提供任何名称映射,因此您必须自己重命名存储过程中的列。
但是。有一个名为Entity Framework Extensions的项目可以使存储过程成为各种不同的场景。
使用EF扩展,您可以以任何方式使用存储过程:
你可以做任何事情。我们在一些项目中使用EF Extensions取得了很大的成功。我们为存储过程返回的实体编写了自己的物理化器(基本上是lamba表达式)。然后我们实现了他们的结果。
我认为EF4无论如何都不会支持这个级别的存储过程,因此熟悉EF Extensions总是有价值的。
答案 1 :(得分:0)
.NET 3.5 SP1中的EF无法映射返回标量值的过程(在.NET 4.0中可以)。 SP必须返回实现完整实体所需的所有值,这可能不仅仅是ID。
此外,在LINQ to Entities中使用“join”保留字几乎永远不正确。您可以在客户端模式中遍历关系。
首先编写一个proc,它返回实体类型所需的所有值。映射那个proc。然后做:
IQueryable<MyEntity> q = from e in Context.MyEntities
select e;
然后继续前进。