2011-02-02 60 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 

它给我想要的结果,但我不知道这是否是好的查询。必须有另一种方式比这更好。

相关问题