2017-10-18 88 views
0

是什麼在這個崗位查詢之間的區別: Save LINQ Query As Variable To Call Another LINQ QueryLINQ查詢變量傳遞到另一個LINQ查詢

var parentLoc = (from a in db.PartsLocations 
       where a.LocationName == aContainer 
       select a.ParentLocation); 

var locations = (from b in db.PartsLocations 
       where b.LocationID == parentLoc 
       select b).ToList(); 

this後下面的例子。

Dim persVogel = From p In db.People 
       Where p.LastName = "Vogel" 
       Select p 

Dim persVogelPHVIS = From pp In persVogel 
        Where pp.Company.Name = "PHVIS" 
        Select pp 

這兩個都聲明瞭2個查詢並將第一個查詢變量用於第二個查詢。 在第一個示例中使用Single()的原因是什麼,但未在visualstudiomagazine.com文章中使用?謝謝

+0

'Single()'?哪裏?兩種結果的用法都不明顯嗎? –

+1

你的第一個例子是C#,其次是VB,這是令人困惑的 – Turo

+0

謝謝佈雷特。那麼可以推斷數據庫在第一個示例中被查詢兩次 - 一個獲得Single(),然後處理第二個查詢? –

回答

0

這兩個樣本是根本不同的。

第一個樣品

我覺得你錯誤地粘貼這樣的產品......從引用的問題,查詢應該是:

var parentLoc = (from a in db.PartsLocations 
       where a.LocationName == aContainer 
       select a.ParentLocation).Single(); 

var locations = (from b in db.PartsLocations 
       where b.LocationID == parentLoc 
       select b).ToList(); 

(我會認爲LocationIDParentLocation是鍵入爲int。)

在此示例中,parentLocint -的單個實例值,從PartsLocations表中獲得。所以你得到的是一個int

第二條linq語句也從PartsLocations表中獲取其記錄。它使用parentLoc來識別該表內的記錄(例如where b.LocationID == parentLoc)。最後得到的是一組PartsLocations記錄。

調用.Single()是因爲要在第二條語句中將結果與LocationID進行比較,並且無法將intIEnumerable<int>進行比較。

第二個樣本

Dim persVogel = From p In db.People 
       Where p.LastName = "Vogel" 
       Select p 

Dim persVogelPHVIS = From pp In persVogel 
        Where pp.Company.Name = "PHVIS" 
        Select pp 

在第二個樣品,persVogel是從People表記錄的子集(具體而言,與LastName == "Vogel"人的子集) - 所以你得到的是一套People記錄。

第二條linq語句基於這個記錄子集(From pp In persVogel),並進一步將它們過濾爲記錄,其中pp.Company.Name = "PHVIS"。你得到的仍然是一組People記錄。

這兩句話很容易被壓縮成一個單獨的語句:

Dim persVogelPHVIS = From p In db.People 
        Where p.LastName = "Vogel" 
        AndAlso p.Company.Name = "PHVIS" 
        Select p 

你仍然會在最後得到一組People記錄。