2012-12-03 23 views
0

仍然習慣於使用LINQ語法,並且遇到了需要在LINQ中創建的查詢 - 但並不完全知道如何。將高級查詢從SQL轉換爲LINQ

SELECT *, 
    (SELECT 1 FROM Applications 
    WHERE Applications.jID = Jobs.ID 
    AND Applications.uID = @uID) AS Applied 
FROM [Jobs] 

打在LinqPad,但界面是不是真的幫助(至少在我所看到的)。

+2

你能用我們的英語描述你的查詢的目標嗎? –

+0

當然。它提供了作業列表(來自喬布斯部分的*)。如果當前用戶已應用到作業,則(選擇1 ...)將返回。因此,結果集應該是: [ID],[JobTitle],[Location],[1或null] – MetalAdam

+4

您試圖使用子查詢,但並非真正必要。你可以用左外連接完成你所需要的。看到這裏用LINQ外連接:http://msdn.microsoft.com/en-us/library/bb397895.aspx –

回答

2

基於你一個LEFT OUTER JOIN後是由保羅·薩西克提供的鏈接,以及他的意見時,該查詢將滿足您的要求;

var query = from job in jobs 
      join app in applications on job.ID equals app.jID into grouped 
      from subApp in grouped.DefaultIfEmpty() 
      select new { Job = job, Applied = (subApp != null) }; 

EDIT: 要由用戶進行篩選,更新查詢如下;

var query = from job in jobs 
    join app in 
    (
     from userApp in applications where userApp.uID == uID select userApp 
    ) on job.ID equals app.jID into grouped 
    from subApp in grouped.DefaultIfEmpty() 
    select new { Job = job, Applied = (subApp != null) }; 

我個人會恢復到剛使用。凡()方法是直接在這一點上,但只是覺得應該把一切都保持一致,並繼續使用的查詢語法。

+0

這就是我提出的保羅的建議。但是,我正在重複Job列表,其中Applied列顯示每個作業都爲「True」。 – MetalAdam

+1

你的數據是什麼樣的?是否還需要其他過濾器,例如用戶ID?如果給定作業有多個應用程序,則上面給出的代碼將返回重複的作業行。如果我們可以通過UserId來縮小結果,那麼結果應該更有用(假設用戶只能申請一次相同的工作)。 –

+0

啊,是的。我們已經忘記了所有這些用戶標識。在應用程序表中,有一個uID字段.... – MetalAdam

0
var jobs = from j in this.db.Jobs 
      where !j.Applications.Any(x => x.UserId == currentUserId) 
      select j; 
+1

我仍然想要顯示用戶尚未申請的作業,因此將額外的列添加到結果集中。 – MetalAdam

+1

本示例執行內部聯接並過濾掉不匹配的記錄。 OP需要來自'Jobs'的所有記錄的標誌值爲與'Applications'連接的標誌值。 –

+0

我的錯誤在於誤解。編輯。 –

0

我建議檢出工具Linqer - 它將SQL轉換爲Linq代碼。這不是免費的,但有10天的試用期。

enter image description here