2010-03-17 58 views
1

我有以下LINQ查詢,我需要轉化爲實體SQL/ESQL):實體框架(3.5):如何將某個LINQ查詢轉換爲eSQL?

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

User.Roles是一個導航屬性的多對多關係到角色同時還有一個Role.Users導航屬性相反。模型中沒有可用的User_Roles或Roles_User實體,並且我無法添加這些實體。

我也不能在這裏使用LINQ語句,因爲我需要添加.OrderBy(「it。」+ propertyname)(來自另一個來源,不能改變它)以後不可能如果ObjectQuery是用linq構建的。

那麼如何將其轉換爲eSQL?我在哪裏可以找到好的eSQL樣本?我搜索了整整一天直到現在,並且必須承認eSQL引用是糟糕的,網絡上沒有任何有用的例子。

+0

我不明白,「我也不能使用這裏的LINQ語句,因爲我需要添加.OrderBy(「it。」+ propertyname)「。 QueryBuilder方法(例如,'OrderBy(「it。」+ ...'你建議)與LINQ一起工作良好,只需將'IQueryable ''投入'ObjectQuery '並去。 – 2010-03-17 14:24:06

+0

我試過了,但是在運行時我得到這樣的錯誤:「查詢生成器方法不支持LINQ to Entities查詢。」 – 2010-03-17 15:15:04

+0

您必須先執行QB部分 – 2010-03-18 14:01:43

回答

1

在你還沒有找到解決辦法的情況下,這將工作

SELECT VALUE u FROM YourDataContextEntities.Users AS u WHERE NOT EXISTS(SELECT r FROM u.Roles AS r WHERE r.AnyIntegerProperty < 0) 
0

我認爲,動態的LINQ庫可能是這裏的解決方案:

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

您可以使用動態屬性名稱過濾表達式,所以沒有必要進行翻譯。

+0

但是我的政治家沒有涉及動態屬性名稱T' 如上所述,.OrderBy(「it。」+ name)來自另一個來源,我無法改變這一點,另外我不能依靠當前工作的類來打破現有的外部代碼。 – 2010-03-17 12:14:05

+0

@Sebastian P.R. Gingter:'.OrderBy(「it。」+ name)'應該可以工作。我不知道這裏有什麼問題。 – LukLed 2010-03-17 12:39:17

+0

不起作用。對於使用LINQ在代碼中構造的ObjectQuery,不能使用.OrderBy(「esqlStatement」)。運行時出現的錯誤消息是:「LINQ to Entities查詢不支持查詢生成器方法」。如果我使用eSQL構建ObjectQuery(使用比17更早的用戶的簡單語句),它就可以工作。所以我需要使用eSQL來構建我所陳述的查詢,但我完全停留在這一點上。 – 2010-03-17 12:50:52

0

我會寫它像

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

未經測試,但我已經嘗試過類似的東西,所以應該THI爲你工作。

0

如果不知道用戶和角色可用的具體內容,很難找到答案。然而,鑑於你所說,將以下工作:

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