具有存储过程的多租户EF实现

时间:2011-04-21 23:47:54

标签: c# linq entity-framework stored-procedures linq-to-entities

在EF4中使用SProcs时,我理解将视图映射到实体的概念,然后使用函数导入将我的set / update / deletes映射到sprocs。我的问题是这如何适用于多租户架构。请考虑以下情形:

我们有数百名客户使用我们的多租户数据库/应用程序。每个客户在Accounts表中有50-200个帐户。如果我向EF公开视图,我无法参数化该视图。所以以下一行:

query = (from e in context.Accounts select e).where(e => e.companyID = 1)
[forgive me if I'm syntactically incorrect. still learning EF!]
根据定义,

必须首先返回所有帐户,然后使用我的wear子句进行过滤。它是否正确?我无法想象这个过程会如何起作用。

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:3)

这是Linq-To-Objects和Linq-To-Entities之间的区别。 Linq-To-Objects在IEnumerable<T>上运行,您将委托传递给它的方法来定义将在内存中执行的查询。 Linq-To-Entities在IQueryable<T>上运行,你将表达式传递给它的方法,定义表达式树,由Linq-to-entities提供者转换成另一种语法 - 到SQL!

因此,您的查询将在数据库中执行,并且过滤也将在数据库中完成。请注意,执行AsEnumerableToArrayToDictionaryToList等命令后,您可以将查询的其余部分转换为Linq-to-objects。

如果您对存储过程执行的结果编写查询,那么您始终只执行Linq-to-objects查询ObjectSet直接形成Linq-to-entities查询。

答案 1 :(得分:2)

EF不应该先将所有帐户带回来然后过滤。相反,应该是使用WHERE子句发出查询。

您可以使用SQL事件探查器进行检查,只是为了100%确定。