2010-11-15 28 views
3

我必须从数据库接收特定于用户的工作订单。使用实体框架执行自定义sql4

所有用户的过滤器都是不同的,所以必须做所有的订单运到英国,所有到其他5个国家,一个做所有高价值的东西,一个做包含10个项目等的订单等。

所以,我想出了这个主意(拍它,如果你有一个更好的!)

我为每个用户创建一个视图,所有的视图返回相同的数据,但过滤器是不同的。

在ado.net我会做这样的事情:

string sql = "select * from vwWorkOrders" + userName; 
[rest of the ado.net here] 

,但现在,我使用EF4,我想知道这是什么样的代码是等效的。

+0

什么是'用户名',即? – 2010-11-15 14:31:45

+0

这是用户的名称,所以如果我登录,我想从vwWorkOrdersMichel中选择所有数据,如果您登录,我想选择al;数据来自vwWorkOrdersSaeed – Michel 2010-11-15 14:49:03

+1

请不要为每个用户创建一个视图,否则我的眼睛会流血 – 2010-11-15 15:03:09

回答

9

可以使用ExecuteStoreQuery method就像下面这个例子:

context.ExecuteStoreQuery<vwWorkOrder>(sql); 

这种方法允许你执行存储SQL和获得strongly-键入结果。
如果您需要传递一些参数,只需在ExecuteStoreQuery的调用中传递必需的ObjectParameter实例即可。

+0

我认为这是我想要的,我会马上尝试! – Michel 2010-11-15 14:53:16

+0

工作过,谢谢! – Michel 2010-11-18 12:45:47

3

您可以使用eSQL,它可以在查询中提供更多的灵活性。您可以下载LinqPad以事先进行操作。

// whereClause is a string 
string query = string.Format("select * from ObjectContext.vwWorkOrders where {0}", whereClause); 

然后,只需使用EntityConnectionEntityCommand类对结果的方式从ADO.NET并不完全不同的执行你的命令和循环。

编辑:我刚刚看到你的评论;我认为你的例子中有一个错字。你正在努力实现什么更合适的代码片段:

// userName is a string, ie "Michel" 
string query = string.Format("select * from ObjectContext.vwWorkOrders{0}", userName); 
+0

谢谢,看起来不错! – Michel 2010-11-15 15:17:53