【问题标题】:Joint query in Linq to SQL to select all records even there are some null in the columns of foreign keys即使外键列中有一些空值,Linq to SQL 中的联合查询也可以选择所有记录
【发布时间】:2011-02-02 05:06:14
【问题描述】:

我愿意接受 C# 或 VB.NET 中的所有建议。

我有一个如下图所示的数据库图。我这里也包括数据库脚本@http://pastebin.com/pDC25Gkm

在学生表中,CountryId 和 RoomId 列允许为空。因为有些记录还没有关于房间和国家的信息。 另外,有些学生没有作文。

我正在对所有表进行联合查询。我想选择所有学生 像这样投影结果:

想要的查询结果。

这是我当前的查询,其结果如下图所示:

    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()

当前查询结果

我只得到了一个结果,因为我在每张桌子上都有 (2) William NoMan 记录。但我对其他人一无所知,例如 (3) Sync Master,他拥有除 RoomId 之外的所有内容。

我需要什么来修改上面的查询,这样它就会给我所有的学生,就像上面想要的查询图片一样?谢谢。

【问题讨论】:

  • 您是否尝试过在网上搜索 linq LFET JOIN?查看.DefaultIfEmpty()方法
  • 我现在就试试。谢谢。

标签: c# sql-server vb.net linq-to-sql join


【解决方案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

它给出了我想要的结果,但我不确定它是否是一个好的查询。一定有比这更好的方法。

【讨论】:

    【解决方案2】:

    这是使用 sql server 查询实现此目的的方法。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多