2012-04-20 56 views
0

我有以下波苏斯:如何分区查询并只加载Linq到实体的几个属性?

public Ticket 
{ 
    public int Id { get; set; } 
    public int IdOwner { get; set; } 
    public int IdDependency { get; set; } 
    public string SerialNumber { get; set; } 

    public Owner Owner { get; set; } 
    public Dependency Dependency { get; set; } 
} 

public Owner 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    // Other attributes 
} 

public Dependency 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    // Other attributes 
} 

我想回程票的List仅具有Owner NameDependency Name。问题是,我会写whereOwner,如果在我的过滤器我通过OwnerId,并相同Dependency。看看我的过滤器:

public List<Ticket> SelectTickets(string SerialNumber, int IdOwner, int IdDependency) 
{ 
    IQueryble<Ticket> query = context.Tickets.Where(t => t.SerialNumber == SerialNumber); 

    if (IdOwner != 0) 
    { 
     query = query.Where(??); 
    } 

    if (IdDependency!= 0) 
    { 
     query = query.Where(??); 
    } 

    return query.ToList(); 
} 
+0

我看不懂。你到底想做什么?你想在'where'之后投射吗? – 2014-08-05 12:04:11

回答

0

这将是有道理的,如果我明白你的意思。

 public Ticket 
     { 
      public int Id { get; set; } 
      public int OwnerId{ get; set; } 
      public int DependencyId { get; set; } 
      public string SerialNumber { get; set; } 

      public Owner Owner { get; set; } 
      public Dependency Dependency { get; set; } 
     } 

     public Owner 
     { 
      public int Id { get; set; } 
      public string Name { get; set; } 
      public List<Ticket> Tickets {get;set;} 
     } 

     public Dependency 
     { 
      public int Id { get; set; } 
      public string Name { get; set; } 
      public List<Ticket> Tickets {get;set;} 
     } 
     public List<Ticket> SelectTickets(string serialNumber, int ownerId, int dependencyId) 
     { 
      return context.Tickets.Where(t => t.SerialNumber == serialNumber && t.OwnerId == ownerId && t.DependencyId == dependencyId).ToList(); 
     } 
+0

我认为你错过了这部分“我想返回只有所有者名称和依赖名称的票单列表”。随着您的查询,我将返回整个所有者和依赖关系的票证,而不仅仅是我说的属性。 – 2012-04-20 14:10:07

0

使用select语句。

query = query.Select(t => new Ticket { 
    Owner = new Owner {Name = t.Owner.Name}, 
    Dependency = new Dependency {Name = t.Dependency.Name} 
}); 
return query.ToList(); 

然而,似乎在这种情况下,你不会想退票,但一些其他的对象,如TicketSummary

public class TicketSummary { 
    public OwnerName {get;set;} 
    public DependencyName {get;set;} 
} 

那么你将有

query = query.Select(t => new TicketSummary { 
    OwnerName = t.Owner.Name, 
    DependencyName = t.Dependency.Name 
}); 
return query.ToList(); 
+0

第一次查询时出现以下错误:实体或复杂类型“Model.Ticket”无法在LINQ to Entities查询中构造。 – 2012-04-20 14:15:34

+0

有一种方法可以返回Ticket,只有我说的属性而不创建新类(TicketSummary)? – 2012-04-20 14:17:43

0

你可以将结果查询投影到您在过滤后所需的任何格式。

用这个工作替换你的return语句还是你有更复杂的需求我没有完全理解?

return query.Select(t => new Ticket() { 
    Owner = t.Owner, 
    Dependency = t.Dependency; 
}.ToList(); 
+0

我收到以下错误:无法在LINQ to Entities查询中构造实体或复杂类型'Model.Ticket'。 – 2012-04-20 14:15:53

+0

您需要为您的数据库票据的模型表示创建一个类型。问题是Ticket表示来自数据库的原始数据。您应该创建一个新的TicketRelations类,从您的模型的视角来表示票据的依赖性和所有者的含义。我不知道这两个对象实际上可以重新表达什么。它似乎缺乏凝聚力。根据您希望使用这个精简的票证的情况,也许您可​​以使用此新类型的OwnerName和DependencyName属性而不是对象引用来更好地提取您的DAL? – 2012-04-20 16:15:57

+0

查看sanbornc的答案,显示如何做到这一点。 – 2012-04-20 16:21:50