DataContext的。有没有一种方法可以添加额外的WHERE?

时间:2009-04-02 15:24:42

标签: c# asp.net linq linq-to-sql

所以基本上我有一个仅适用于一个用户的应用程序,但我想让它成为多用户。这将涉及我记录用户,并在会话中保留用户ID,以及向我的数据库表添加用户ID列。没什么大不了的。

我想更改我的dbml,或者使用它的部分内容,以便我通过它获取的任何查询都会得到

.WHERE(user=>user.id=MYPARAM)

添加到它,只返回登录用户的记录。

有一个快速的胜利吗?我可以在.dbml中指定它的一个地方吗?

3 个答案:

答案 0 :(得分:1)

我可能会动态创建一个lambda表达式。

Where子句采用Expression>

类型的对象

然后,您可以使用以下内容创建表达式。

Expression<Func<User,bool>> func = null;

然后

ParameterExpression xParam = Expression.Parameter(typeof(User), "u");

然后,您将使用二进制表达式为u.id =“test”创建表达式。

BinaryExpression uidTest = Expression.Equal(Expression.Property(xParam, "id"),
                                                               Expression.Constant("test");

然后将其附加到Expression,如下所示:

func = Expression.Lambda<Func<User, bool>>(uidTest, xParam)

实际上,这是构建一个lambda表达式u =&gt; u.id =“test”

然后可以在.Where中使用func对象,如下所示: 。凡(FUNC)

显然,您可以在应用程序中随时根据需要动态构建它。

答案 1 :(得分:0)

我不确定是否有类似的东西。

如果没有,则可以为部分类中的所有表公开已过滤的属性。然后,您将接收用户标识作为数据上下文的参数。

您可以将其与动态表达式结合使用,以便这些属性尽可能简单地定义。

答案 2 :(得分:0)

如果您仍然无法使用LINQ to SQL实现此功能,那么您可能希望使用行级安全性在数据库级别解决问题。基本上,您可以使用实现动态谓词的视图来包装每个表:

WHERE user_id = SUSER_SNAME()

这要求您在连接数据库之前动态设置每个用户的连接属性(即每个数据库用户都有一个特定的SQL用户名和密码)。如果这不是一个可行的解决方案,您可能需要考虑围绕L2S上下文构建一个框架,以便您可以注入自己的逻辑。如果您想获得更多灵感,请在此处阅读:http://www.west-wind.com/WebLog/posts/160237.aspx