代码之家  ›  专栏  ›  技术社区  ›  Sebastian P.R. Gingter

实体框架(3.5):如何将某个LINQ查询转换为ESQL?

  •  1
  • Sebastian P.R. Gingter  · 技术社区  · 14 年前

    我有以下需要转换为实体SQL/ESQL的LINQ查询:

    return (ObjectQuery<User>) from user in Users
       where !user.Roles.Any(r => r.AnIntegerProperty < 0)
       select user;
    

    角色是与角色n:m关系的导航属性,也有一个角色。用户导航属性则相反。模型中没有可用的用户角色或角色用户实体,我无法添加这些。

    我也不能在这里使用linq语句,因为我需要在以后添加.orderby(“i t.”+propertyname)(来自另一个源,不能更改它),如果使用linq构建objectquery,就不可能实现这一点。

    那么如何将其转换为ESQL呢?在哪里可以找到好的ESQL示例?到目前为止,我搜索了一整天,必须承认ESQL引用很糟糕,而且在Web上没有任何可用的示例。

    4 回复  |  直到 7 年前
        1
  •  1
  •   Syma    14 年前

    如果你找不到解决办法,这就行了

    SELECT VALUE u FROM YourDataContextEntities.Users AS u WHERE NOT EXISTS(SELECT r FROM u.Roles AS r WHERE r.AnyIntegerProperty < 0)
    
        2
  •  0
  •   LukLed    14 年前

    我认为动态LINQ库可能是这里的解决方案:

    http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

    可以使用动态属性名创建筛选表达式,因此不需要进行转换。

        3
  •  0
  •   moi_meme    14 年前

    我会写得像

    contexte.Users.Where("NOT EXISTS (SELECT VALUE r FROM it.Roles AS r WHERE  r.AnIntegerProperty < 0)")
    

    没有测试过,但我已经尝试过类似的东西,所以我应该为你工作。

        4
  •  0
  •   Thomas    14 年前

    如果不知道用户和角色的具体情况,很难找到答案。然而,考虑到你所说的,以下工作将起作用:

    return (ObjectQuery<User>) from user in Users
                                where !(from role in dataContext.Roles
                                        where role.AnIntegerProperty < 0
                                        select role.UserId).Contains(user.UserId);