使用LINQ连接两个表,同时还从第二个表返回空记录

Tes*_*ell 5 .net c# linq linq-to-entities entity-framework

我有表Message,并Image说我的加盟。这些表如下所示:

Message(MessageID, TimeStamp, Text, RoomID, ImageID, UserID)
Image(ImageID, Path, Type, UserID)
Run Code Online (Sandbox Code Playgroud)

并非所有邮件都有一个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
    };
Run Code Online (Sandbox Code Playgroud)

然后resultTable,我绑定到ListView需要表中的Path列的Image。我当前的联接仅返回带有图像的消息。我将如何选择所有消息,但是如果消息中包含ImageID != null,则为其分配值Path?我认为我应该改变这一行:on m.ImageID equals i.ImageID至少。

Nic*_*las 8

您当前正在执行内连接,但您可以使用DefaultIfEmpty() 创建左外连接。这也将返回空记录。

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 : ""
    };
Run Code Online (Sandbox Code Playgroud)