【问题标题】:DataContext. Is there a single method where I can add an extra WHERE?数据上下文。有没有一种方法可以让我添加额外的 WHERE?
【发布时间】:2009-04-02 15:24:41
【问题描述】:

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

我想更改我的 dbml,或者使用它的部分,这样我通过它抛出的任何查询也会得到 ​​p>

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    Where 子句接受一个表达式类型的对象>

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

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

    然后

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

    然后,您将使用二进制表达式为 u.i​​d = "test" 创建一个表达式。

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

    然后将其附加到表达式,如下所示:

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

    实际上这是在构建一个 lambda 表达式 u=> u.id = "test"

    然后就可以在.Where中使用func对象了,如下: .where(func)

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        WHERE user_id = SUSER_SNAME()

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-11
          • 1970-01-01
          相关资源
          最近更新 更多