C# 带存储过程的多租户EF实现

C# 带存储过程的多租户EF实现,c#,linq,entity-framework,stored-procedures,linq-to-entities,C#,Linq,Entity Framework,Stored Procedures,Linq To Entities,在EF4中使用存储过程时,我理解了将视图映射到实体的概念,然后使用函数导入将set/update/deletes映射到存储过程。我的问题是这如何应用于多租户体系结构。考虑下面的场景: 我们有数百名客户在使用我们的多租户数据库/应用程序。在Accounts表中,每个客户都有50-200个帐户。如果将视图公开给EF,则无法参数化该视图。因此,下面这句话: query = (from e in context.Accounts select e).where(e => e.companyID =

在EF4中使用存储过程时,我理解了将视图映射到实体的概念,然后使用函数导入将set/update/deletes映射到存储过程。我的问题是这如何应用于多租户体系结构。考虑下面的场景:

我们有数百名客户在使用我们的多租户数据库/应用程序。在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!]
根据定义,必须首先返回所有帐户,然后使用my wear子句进行筛选。这是正确的吗?我无法想象这个过程会如何运作


我在这里遗漏了什么吗?

EF不应该先把所有帐户都带回来,然后再过滤。相反,它应该发出一个带有WHERE子句的查询


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

EF不应该先将所有帐户恢复,然后再进行筛选。相反,它应该发出一个带有WHERE子句的查询


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

这就是Linq到对象和Linq到实体之间的区别。Linq To Objects在
IEnumerable
上运行,您将委托传递给它的方法,以定义将在内存中执行的查询。Linq To Entities在
IQueryable
上运行,您将表达式传递给它的方法,并定义表达式树,该表达式树由Linq To Entities提供程序转换为另一种语法-To SQL

因此,您的查询将在数据库中执行,过滤也将在数据库中完成。请注意,在执行诸如
aseneumerable
ToArray
ToDictionary
ToList
等命令后,将查询的其余部分转换为Linq to对象


如果您对存储过程执行的结果编写查询,那么您总是在对对象执行Linq操作,仅查询对象集直接形成Linq到实体查询。

这就是Linq到对象和Linq到实体之间的区别。Linq To Objects在
IEnumerable
上运行,您将委托传递给它的方法,以定义将在内存中执行的查询。Linq To Entities在
IQueryable
上运行,您将表达式传递给它的方法,并定义表达式树,该表达式树由Linq To Entities提供程序转换为另一种语法-To SQL

因此,您的查询将在数据库中执行,过滤也将在数据库中完成。请注意,在执行诸如
aseneumerable
ToArray
ToDictionary
ToList
等命令后,将查询的其余部分转换为Linq to对象


如果您对存储过程执行的结果编写查询,您总是对对象执行Linq,仅直接查询对象集形成Linq到实体查询。

是的,您是对的,您的设计确实不好。@John:请告诉我们哪一部分是不好的设计好吗?OP讨论的类型的多租户架构是很常见的。我认为将所有租户的数据放入单个数据库是一个糟糕的设计。这样做需要“租户id”成为每个主键的一部分,例如,否则你会遇到荒谬的事情,就像一个租户的客户订购另一个租户的产品一样。(a)我没有设计它,在设计中没有发言权,或者有能力更改设计。(b) 多租户设计是常见的(c)谢谢你这样的说明。是的,你是对的,你的设计确实不好。@John:想告诉我们哪一部分是不好的设计吗?OP讨论的类型的多租户架构是很常见的。我认为将所有租户的数据放入单个数据库是一个糟糕的设计。这样做需要“租户id”成为每个主键的一部分,例如,否则你会遇到荒谬的事情,就像一个租户的客户订购另一个租户的产品一样。(a)我没有设计它,在设计中没有发言权,或者有能力更改设计。(b) 多租户设计是常见的(c)谢谢你这样的启发。好的,我明天再检查。谢谢好的,我明天再查。谢谢