2009-07-22 97 views
0

我对linq很陌生,很难创建一个查询。 我有一个'Customers'表和'Orders'表,一对多的关系。 如何选择那些在订单描述中拥有“特殊”一词的最早订单的客户?Linq查询问题(一对多,子对象属性过滤器)

如果最早的订单不包含这个词,客户不应该在结果中。如果客户没有订单,他不应该在结果中。换句话说,只有那些有订单且最老的订单中有'特殊'字样的客户应该在那里。

我希望我很清楚,谢谢。

回答

3

公共静态列表<客户> SampleSelect(名单<客户>客户端)
{
       回报clients.Where(C = > c.Orders.Count &
                                                                          c.Orders.OrderBy(O = > o.Date)
                                                                                          .FirstOrDefault()。Description.Conta插件( “特殊”))ToList()。
}

//固定排序,日Thnx瑞安Versaw

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; 

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

期望客户重复。如果您需要不重复,请添加一个group by子句。

祝你好运,报告它的效果如何。 :)

编辑:

谢谢,Randolpho,问题是,我没有myMinDate和myMaxDate。我需要能够检查最旧订单的描述。我觉得我应该使用类似于c.Orders.Where(x => x.OrderDate.Max())的地方,但不能正确地组成整个查询。谢谢。 - 瓦伦丁·瓦西里耶夫

嗯......我不能,如果你想用最古老的秩序,从客户,你要检查描述或如果你想与最古老的订单,客户告诉在订单描述中有“特殊”一词。

如果你想用最古老的订单的客户,然后要检查的描述,你应该做这样的事情:

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包含最早订单的描述字段。

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

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(); 

在这种情况下,与包含在描述中的“特殊”二字最早的记录的客户是在名为oldestCustomerWithSpecial变量。

我不认为在OrderDate上使用Max会帮助你。使用按日期TOP 1查询的订单几乎总是更好。在查询上调用First()会做到这一点。

+0

谢谢,Randolpho,问题是,我没有myMinDate和myMaxDate。我需要能够检查最旧订单的描述。我觉得我应该使用类似于c.Orders.Where(x => x.OrderDate.Max())的地方,但不能正确地组成整个查询。谢谢。 – Valentin 2009-07-22 14:36:30

+0

我的情况是第一个。不幸的是,它不能编译,我无法在这里访问OrderDate:由customer.Orders.OrderDate升序, ,因为Orders是一个集合。 – Valentin 2009-07-22 16:06:46