Совместный запрос в Linq to SQL для выбора всех записей, даже если в столбцах внешних ключей есть ноль - PullRequest
1 голос
/ 02 февраля 2011

Я бы хотел принять все предложения в C # или VB.NET.

У меня есть схема БД, как на картинке ниже. Я также включаю сценарий базы данных здесь @ http://pastebin.com/pDC25Gkm

Database diagram

В таблице Student столбцы 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) запись William NoMan в каждой таблице. Но я ничего не понимаю о других, таких как (3) Sync Master, у которого есть все, кроме RoomId.

Что мне нужно, чтобы изменить запрос выше, чтобы он дал мне всех учеников, как показано на изображении разыскиваемого запроса выше? Спасибо.

Ответы [ 2 ]

1 голос
/ 02 февраля 2011

Я использовал следующий запрос:

    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

Он дает желаемый результат, но я не уверен, что это хороший запрос.Должен быть другой способ лучше этого.

0 голосов
/ 02 февраля 2011

Вот как это можно сделать с помощью запроса к серверу sql.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...