Linq查询问题(一对多,子对象属性过滤器)

时间:2009-07-22 14:21:20

标签: linq-to-sql

我对linq很陌生并努力创建查询。 我有一个'客户'表和'订单'表,一对多的关系。 如何在订单描述中选择具有最早订单并带有“特殊”字样的客户?

如果最旧的订单不包含此字词,则客户不应该在结果中。如果客户没有订单,他不应该在结果中。换句话说,只有拥有订单且其最早订单中包含“特殊”字样的客户应该在那里。

我希望我很清楚,谢谢你。

2 个答案:

答案 0 :(得分:3)

public static List< Client> SampleSelect(List< Client> clients)
{
return clients.Where(c => c.Orders.Count> 0&&
c.Orders.OrderBy(o = > o.Date)
.FirstOrDefault()。Description.Contains(“Special”))。ToList();
}

//固定订购,thnx到Ryan Versaw

答案 1 :(得分:1)

这是一个快速推测,可以从您的问题中推断出我的能力。它可能准确也可能不准确:

var dc = new MyDataContext();    
var qry = from customer in dc.Customers 
          where customer.Orders.Description.Contains("special")
             && customer.Orders.OrderDate > myMinDate 
             && customer.Orders.OrderDate < myMaxDate 
          order by customer.Orders.OrderDate ascending 
          select customer;

它应返回按订单日期排序的客户对象,按最小和最大日期过滤。如果您不想按日期过滤,则可以删除这两行。

期待客户重复。如果您需要非重复,请添加group by子句。

祝你好运,报告它的运作情况。 :)

修改

  

谢谢,Randolpho,问题是我没有myMinDate和myMaxDate。我需要能够检查最旧订单的描述。我觉得我应该使用像c.Orders.Where(x =&gt; x.OrderDate.Max())这样的东西,但不能正确地组成整个查询。谢谢。 - Valentin Vasiliev

嗯......我不知道您是否希望客户拥有最早的订单,并且您希望检查描述,或者您是否希望客户拥有订单中包含“特殊”字样的最旧订单描述。

如果您希望客户拥有最早的订单,然后想要查看说明,您应该这样做:

var qry = from customer in dc.Customers
          order by customer.Orders.OrderDate ascending
          select new 
          { 
             CustomerData = customer, 
             OrderDescription = customer.Orders.Description
          };
var oldest = qry.First();
if(oldest.OrderDescription.Contains("special"))
{
    // do something
}

在这种情况下,最旧的是一个新的匿名类型,它有两个字段,CustomerData,其中包含具有最早订单的客户,以及OrderDescription,其中包含最旧订单的描述字段。

另一方面,您可能需要包含“特殊”一词的最旧订单。在这种情况下,你应该这样做:

var qry = from customer in dc.Customers
          where customer.Orders.Description.Contains("special")
          order by customer.Orders.OrderDate ascending
          select customer;
var oldestCustomerWithSpecial = qry.First();

在此方案中,描述中包含“special”一词的最旧记录的客户位于名为oldestCustomerWithSpecial的变量中。

我不认为在OrderDate上使用Max会对你有所帮助。使用按日期TOP 1查询的订单几乎总是更好。在查询上调用First()就可以了。