我有类似的事情
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; }
}
答案 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();
使用此条件包含,仅在必要时才进行连接。
注意:我根据您的数据模型做了一些假设(您的关系的基数是什么?)。不要犹豫要精确一些事情,这样我才能更明确。