2011-02-02 59 views
1

我想在C#或VB.NET中採取所有建議。Linq to SQL中的聯合查詢來選擇所有記錄,即使外鍵列中有一些空字符

我有一個DB圖,如下圖所示。我還包括這裏的數據庫腳本@http://pastebin.com/pDC25Gkm

Database diagram

在學生表,CountryId和RoomId列允許空值。因爲有些記錄還沒有關於房間和國家的信息。 另外,有些學生沒有散文。

我正在與所有表進行聯合查詢。我想選擇所有學生到 項目結果是這樣的:

通緝查詢結果。

Wanted query result

這裏是我當前的查詢給出結果如下圖:

Dim db As New DBDataContext 

    Dim query = From st In db.Students _ 
       Join c In db.Countries On c.Id Equals st.Id _ 
       Join r In db.Rooms On r.Id Equals st.RoomId _ 
       Join b In db.Buildings On b.Id Equals r.BuildingId _ 
       Join es In db.Essays On es.StudentId Equals st.Id _ 
       Select st, c, r, b, es 

    'put query result into datatable 
    Dim dt = New DataTable("Result") 
    dt.Columns.Add("Id", GetType(Integer)) 
    dt.Columns.Add("Name", GetType(String)) 
    dt.Columns.Add("Room", GetType(String)) 
    dt.Columns.Add("Building", GetType(String)) 
    dt.Columns.Add("Country", GetType(String)) 
    dt.Columns.Add("Essay", GetType(String)) 

    For Each q In query 

     dt.Rows.Add(New Object() {q.st.Id, q.st.FullName, q.r.RoomNumber, q.b.BuildingName, q.c.CountryName, q.es.Eassay}) 

    Next 

    'bind to list view 
    lvStudent.DataSource = dt 
    lvStudent.DataBind() 

當前查詢結果

Current query result

我只有一個結果回因爲我有(2)威廉諾曼記錄在每張表中。但我沒有得到任何關於其他人的信息,比如(3)擁有除RoomId以外的一切的Sync Master。

我需要修改上面的查詢,所以它會給我所有的學生喜歡上面想要的查詢圖像?謝謝。

+1

你試過在網上搜索linq`LFET JOIN`嗎?看看`.DefaultIfEmpty()`方法 – 2011-02-02 05:12:49

回答

0

這是如何使用sql server query來實現這一點的。

select students.id, fullname, isnull(roomid,'') as Room, 
isnull((select top 1 buildingid from rooms where rooms.id = roomid), '') as building, 
isnull((select top 1 countryname from countries where Countries.id = countryid), '') as Country, 
isnull((select top 1 eassay from essays where Essays.studentid = Students.id), '') as essay from students 
1

我用下面的查詢:

Dim query = From st In db.Students _ 
      From c In db.Countries.Where(Function(c) c.Id = st.CountryId).DefaultIfEmpty _ 
      From r In db.Rooms.Where(Function(r) r.Id = st.RoomId).DefaultIfEmpty _ 
      From b In db.Buildings.Where(Function(b) b.Id = r.BuildingId).DefaultIfEmpty _ 
      From es In db.Essays.Where(Function(es) es.StudentId = st.Id).DefaultIfEmpty _ 
      Select st.Id, st.FullName, c.CountryName, r.RoomNumber, b.BuildingName, es.Eassay 

它給我想要的結果,但我不知道這是否是好的查詢。必須有另一種方式比這更好。

相關問題