使用 LINQ 连接两个 table,同时还从第二个 table 返回空记录
Joining two tables with LINQ while also returning null records from the second table
我要加入 table、Message
和 Image
。 table 看起来像这样:
Message(MessageID, TimeStamp, Text, RoomID, ImageID, UserID)
Image(ImageID, Path, Type, UserID)
并非所有消息都有 ImageID
。这是我当前的加入:
List<Message> messages = Message.GetAll();
List<Image> images = Image.GetAll();
var resultTable = from m in messages
join i in images
on m.ImageID equals i.ImageID
select new
{
MessageID = m.MessageID,
TimeStamp = m.TimeStamp,
Text = m.Text,
RoomID = m.RoomID,
ImageID = m.ImageID,
UserID = m.UserID,
Path = i.Path // Nullable
};
然后我将 resultTable
绑定到需要 Image
table 中的 Path
列的 ListView
。我目前仅加入 returns 条带图片的消息。我如何 select 所有消息,但如果消息有一个 ImageID != null
,然后为其分配一个值 Path
?我想我应该更改此行:至少 on m.ImageID equals i.ImageID
。
您当前正在进行内部联接,但您可以使用 DefaultIfEmpty() to create a left outer join。这也将 return 空记录。
var resultTable = from m in messages
join i in images on m.ImageID equals i.ImageID into imgJoin
from img in imgJoin.DefaultIfEmpty()
select new
{
MessageID = m.MessageID,
TimeStamp = m.TimeStamp,
Text = m.Text,
RoomID = m.RoomID,
ImageID = m.ImageID,
UserID = m.UserID,
Path = img != null ? img.Path : ""
};
我要加入 table、Message
和 Image
。 table 看起来像这样:
Message(MessageID, TimeStamp, Text, RoomID, ImageID, UserID)
Image(ImageID, Path, Type, UserID)
并非所有消息都有 ImageID
。这是我当前的加入:
List<Message> messages = Message.GetAll();
List<Image> images = Image.GetAll();
var resultTable = from m in messages
join i in images
on m.ImageID equals i.ImageID
select new
{
MessageID = m.MessageID,
TimeStamp = m.TimeStamp,
Text = m.Text,
RoomID = m.RoomID,
ImageID = m.ImageID,
UserID = m.UserID,
Path = i.Path // Nullable
};
然后我将 resultTable
绑定到需要 Image
table 中的 Path
列的 ListView
。我目前仅加入 returns 条带图片的消息。我如何 select 所有消息,但如果消息有一个 ImageID != null
,然后为其分配一个值 Path
?我想我应该更改此行:至少 on m.ImageID equals i.ImageID
。
您当前正在进行内部联接,但您可以使用 DefaultIfEmpty() to create a left outer join。这也将 return 空记录。
var resultTable = from m in messages
join i in images on m.ImageID equals i.ImageID into imgJoin
from img in imgJoin.DefaultIfEmpty()
select new
{
MessageID = m.MessageID,
TimeStamp = m.TimeStamp,
Text = m.Text,
RoomID = m.RoomID,
ImageID = m.ImageID,
UserID = m.UserID,
Path = img != null ? img.Path : ""
};