动态左连接实体框架6

时间:2017-08-08 08:38:01

标签: entity-framework entity-framework-6 linq-to-entities

我有类似的事情

if (this.IncludeGuestlist)
{
    return from tn in tnQuery
           join gi in bl.Database.GuestlistItems on tn.Id equals gi.TicketNumberId into gj
           from giJoined in gj.DefaultIfEmpty()
           select new TicketNumberTempDTO()
           {
               Id = tn.Id,
               LookupId = tn.LookupId,
               CheckingId = tn.CheckingId,
               GuestlistName = giJoined.GuestlistDefinition.Name
           };
}
else
{
    return from tn in tnQuery               
           select new TicketNumberTempDTO()
           {
               Id = tn.Id,
               LookupId = tn.LookupId,
               CheckingId = tn.CheckingId
           };
}

鉴于我不希望在没有必要的情况下发生左连接,是否有可能统一这个以便我不必写两次选择?

[e.g。写下" base" select(Id,LookupId,CheckingId),如果IncludeGuestlist为true,则将join和GuestlistName添加到现有的select]

编辑: 简化模型如下,tnQuery是动态构建的IQueryable

public class TicketNumber
{     
    public int Id { get; set; }
    public string LookupId { get; set; }
    public string CheckingId { get; set; }
}

public class GuestlistItem
{     
    public int Id { get; set; }

    public int GuestlistDefinitionId { get; set; }
    public virtual GuestlistDefinition GuestlistDefinition { get; set; }

    public int TicketNumberId { get; set; }
    public virtual TicketNumber TicketNumber { get; set; }
}

public class GuestlistDefinition
{     
    public int Id { get; set; }
    public string Name {get; set; }
}

1 个答案:

答案 0 :(得分:0)

我将新的导航属性添加到TicketNumber:

public class TicketNumber
{     
    // your properties

    public virtual List<GuestlistItem> GuestListItems { get; set; }
}

然后:

var query = context.Set<TicketNumber>().AsQueryable();

if (IncludeGuestlist)
{
    query = query.Include(tn => tn.GuestListItems);
}

var ticketNumbers = query.Where(/* do your filter logic here */).ToList(); // You can use SingleOrDefault instead. It depends on your case.

return ticketNumbers
    .Select(tn => new TicketNumberTempDTO
    {
        // make your assignation logic
        GuestlistName = GuestListItems?.FirstOrDefault()?.Name
    }).ToList();

使用此条件包含,仅在必要时才进行连接。

注意:我根据您的数据模型做了一些假设(您的关系的基数是什么?)。不要犹豫要精确一些事情,这样我才能更明确。