2012-10-22 62 views
0

執行嵌套查詢我有一個LINQ類這種格式在C#:如何在LINQ的

class Vehicle 
{ 
    int _VehicleID 
    int _ModelID 

    EntetySet<Cars> _AllCars 
    EntetySet<Bus> _AllBus 
    EntetyRef<Driver> _Person 
} 

汽車表

CarsID | Manufacturer | Type 
1000 | Honda  | Diesel 
1001 | Mitsubishi | Petrol 
1002 | Maruti  | Diesel 

總線表

BusID | Manufacturer | Type 
2000 | Volvo  | Diesel 
2001 | TATA   | Petrol 
2002 | layland  | Petrol 

在用戶界面中,我將獲得車輛ID作爲參數。基於此,所有汽車,巴士及其相關表格都將被複制到一個變量中。即:

Vehicle v1 = new Vehicle(); 
v1 = dc.vehicle.where(v => v.vehicleID == param.vehicleID).findfirst(); 

我的v1已滿足上述條件的所有表格及其內容。

現在,我想根據桌面汽車和公共汽車中的表格內容過濾一些信息;即基於車輛汽油或柴油的類型。

如果我想在一行中使用查詢語句複製所有汽油車和巴士,請告訴我方式。

在此先感謝。

+2

什麼是'Vehicle'?爲什麼它有汽車等?在這裏似乎應該有像繼承這樣的東西。 –

+0

@ gert,我已經給出了一個簡單的例子..我想知道如何使用嵌套查詢訪問的內容......這是在內部表 – Naruto

+0

如果這只是一個例子,我建議用' Fleet'。然後你有一個由巴士和汽車組成的車隊,這更有意義。 – Bobson

回答

2

**編輯基於評論**

你的問題由我莫名其妙地滑倒的邏輯,因爲我正在上車的邏輯人的做法。每當我看到這Vehicle class我立即看到汽車和公共汽車作爲車輛。 這表明命名選擇不當。 但是,從我看來,沒有更多。

我知道你想要一輛車的身份證,並且你想讓結果只包含汽車和公共汽車,讓我們來說說汽油,一條線。 如果它被轉換爲SQL,那麼我不知道樹在選擇內可以走多遠,但是如果它在內存中,則可以在子查詢中進行很長時間。

你可以使用一個「模型」類來實現,否則,你可以用一個匿名類型去,但我會舉一個例子爲「模型」類:

例子:

public class VehicleModel 
{ 
    public int VehicleID { get; set; } 
    public int ModelID { get; set; } 
    public List<Cars> Cars { get; set; } 
    public List<Bus> Buses { get; set; } 
} 

var vehicleID = 1; // just for the example of course. 
var fuelType = "Petrol"; 
var vehicle = (from v in dc.vehicle 
       where v._VehicleID == vehicleID 
       select new VehicleModel 
       { 
        VehicleID = v._VehicleID, 
        ModelID = v._ModelID, 
        Cars = v._AllCars.Where(car => car.Type == fuelType).ToList(), 
        Buses = v._AllBus.Where(bus => bus.Type == fuelType).ToList() 
       }).SingleOrDefault(); 
       // use FirstOrDefault() when _VehicleID is NOT unique to get TOP 1 

不要修改Entity本身內的EntitySets,總是使用模型來處理這些事情,因爲如果你這樣做並在你的EntityContainer上調用保存更改,各種事情都可能出錯。

如果你想知道匿名類型看看這裏: http://msdn.microsoft.com/en-us/library/bb397696(v=vs.100).aspx

而且這裏看看LINQ的例子: http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b




- 編輯之前

您的意思是:

var query = dc.vehicle.Where(v => 
          v._AllCars.Any(c => c.Manufacturer == "Honda") || 
          v._AllBuss.Any(b => b.Manufacturer == "Volvo")); 

這會給你所有車輛的車是本田或巴士是沃爾沃。 這將是:

1000 |本田|柴油
2000 |沃爾沃|柴油

結果是一個IEnumerable,包含全部或不包含滿足條件的項目。

如果你只是想先打你可以這樣做:

//if it must exist, otherwise this throws an exception 
var firstVehicle = query.First(); 
//if it may exist, otherwise null 
var firstVehicle = query.FirstOrDefault(); 
+0

我有一個特定類內的7個表,現在他們只是基於一個條件複製表內容是ID,現在我想複製的內容基於更多的一個條件,即第一個父類和類型的ID目前在兒童班。所以,你會工作嗎?我是新的,我需要嘗試:( – Naruto

+0

如果我不寫()在最後我不能複製到成員變量,我會得到類型轉換錯誤,爲什麼是這樣?..在你的情況下,我需要手動複製到Vehicle對象的一個​​循環 – Naruto

+0

@LLL我已經更新我對你的評論的回答 – Silvermind

1

看來你想是這樣的:

var v1 = dc.vehicle.Where(v => v.vehicleID == param.vehicleID 
          && v.Cars.All(c => c.Type == "Petrol") 
          && v.Buses.All(c => c.Type == "Petrol")).First(); 

獲得「車輛」,它的所有小轎車和公交車有汽油。 (請注意,我使用「Cars」而不是非常規名稱「_AllCars」等)。

編輯

或者:

var v1 = dc.vehicle.Where(v => v.vehicleID == param.vehicleID) 
    .Select(v => new { 
         Id = v.vehicleID, 
         Cars = v.Cars.Where(c => c.Type == "Petrol"), 
         Buses = v.Buses.Where(c => c.Type == "Petrol") 
        }).First(); 

得到一個匿名類型與過濾集合。

+0

@Gret Arnold,first()方法只會複製最上面的結果吧?但內部查詢會根據型號爲我提供所有的汽車和公共汽車嗎?.. – Naruto

+0

是的,這是正確的。 –

+0

我的車輛ID是唯一的,但是我有嵌套的表格有多個汽油和柴油車輛的權利?..所以我的輸出將一排車輛ID實際鏈接到多個汽油車輛是否正確?我很新,所以要求請你介意 – Naruto