2014-10-16 71 views
1

我有一个表,看起来像这样:的LINQ到SQL过滤的最后一个元素的日期

FruitID | BasketID | HarvestDate 
    10 | 435 | 10/1/2014 
    11 | 430 | 8/4/2014 
    12 | 435 | 3/1/2014 
    13 | 430 | 5/2/2014 

我想在BasketIDs的列表,以传递和返回只有BasketID,所有的HarvestDate少比某个日期。例如,如果我传递430和435以及9月29日的数据,那么查询应该只返回430,因为435的Fruit 10的HarvestDate超过了参数。

这是我有:

var Output = (from f in MyDC.Fruits 
       where TheBasketIDs.Contains(f.BasketID) && 
       f.HarvestDate <= TheDate 
       select f.BasketID).ToList(); 

我的直觉告诉我,我应该按匹配的,然后排序HarvestDate通过ID和采取BasketIDs其中最后日期是小于日期参数BasketIDs但我坚持语法。我该如何解决这个问题?

谢谢。

+0

什么让你觉得你需要“修复”查询?你有没有试过你已经有的查询? – 2014-10-16 14:57:18

+0

是的,这是我的查询,问题是当我通过日期9/29时,它将同时返回430和435。它不应该返回435,因为那个篮子的收获日期也是10/1。该查询的工作原理是它不会出错,但不会返回预期值。 – frenchie 2014-10-16 15:01:18

回答

4
(from f in MyDc.Fruits 
group f by f.BasketID into g 
where TheBasketIDs.Contains(g.Key) 
&& g.OrderByDescending(gg=>gg.HarvestDate).First().HarvestDate <= TheDate 
select g.First().BasketID).ToList(); 
+0

查询应以.ToList()结尾,因为我们正在返回一个BasketID列表。我仍在使用groupby和where子句来处理它。我尝试使用select g.Select(x => x.BasketID).ToList();但它不工作(还) – frenchie 2014-10-16 15:16:09

+0

@frenchie,请参阅编辑。 – 2014-10-16 15:19:08

+0

好了,看到了编辑:删除了select中的排序过滤器,并编译:选择g.First()。LeadID,然后用(.....).ToList()包装整个查询编辑。我们几分钟就会知道。 – frenchie 2014-10-16 15:21:04

2

正好相反。

选择所有那些收获日大于HarvestDate并且使您的查询和那些在第一个查询中返回的应该被删除。

var Output1 = (from f in MyDC.Fruits 
       where TheBasketIDs.Contains(f.BasketID) && 
       f.HarvestDate > TheDate 
       select f.BasketID).ToList(); 

var Output2 = (from f in MyDC.Fruits 
      where TheBasketIDs.Contains(f.BasketID) && 
      f.HarvestDate <= TheDate 
      select f.BasketID).ToList(); 

var Output = Output2.Except(Output1).ToList(); 
+0

+1。我喜欢你想的方式:) – Reniuz 2014-10-16 15:11:17

+0

我在这里脸红...... tnx :) – ilans 2014-10-16 15:13:01

+0

难道你不需要提供一些定制的比较器吗? – 2014-10-16 15:14:25