使用linq-to-sql查询连接列表

时间:2011-05-11 15:55:46

标签: c# linq

我有MyObject列表,如下所示:

public class MyObject{
  public int FruitID {get;set;}
  public string FruitName {get;set;}
}

List<MyObject> TheList = new List<MyObject>();

此列表填充了linq-to-sql查询。我想在这个列表和一个包含FruitID作为其外键的表之间创建一个连接。

表HarvestTimes看起来像这样:

FruitID   |   HarvestDatetime  |   RipeFactor
   3      |        3/4/2011    |       2
   3      |        4/5/2011    |       4
   3      |        5/5/2011    |       3
   4      |        3/21/2011   |       2
   4      |        4/10/2011   |       2
   4      |        5/10/2011   |       2

这是我到目前为止所做的:

var TheQuery = (from list in TheList
                join fruit in MyDC.HarvestTimes on
                list.FruitID equals fruit.FruitID
                where ....
                select new MyObject{... }).ToList();

我对Where子句有些麻烦。 如何只获得RipeFactor始终为2的Fruit。例如,Fruit 3的RipeFactor为2,但也有4,而只有Fruit4只有2。我尝试使用Contains,但两种水果都出现了。

感谢您的建议。

2 个答案:

答案 0 :(得分:3)

假设表HasrstTime和Fruit之间存在关系:

var TheQuery = MyDC.HarvestTimes
    .Where(p => TheList.Select(q => q.FruitID).Contains(p.FruitID))
    .GroupBy(p => p.Fruit)
    .Where(p => p.All(q => q.RipeFactor == 2))
    .Select(p => p.Key);

这将创建一个IEnumerable<Fruit>我认为可以轻松转换为MyObject。

更新: 哎呀我忘了添加TheList.Select(q =&gt; q.FruitID)。这就是它没有编译的原因。 对不起=)

UPDATE2: 同样,考虑Ripefactor = 2和3

var TheQuery = MyDC.HarvestTimes
    .Where(p => TheList.Select(q => q.FruitID).Contains(p.FruitID))
    .GroupBy(p => p.Fruit)
    .Where(p => p.All(q => q.RipeFactor == 2 || q.RipeFactor == 3))
    .Select(p => p.Key);

答案 1 :(得分:1)

我认为这会起作用

var fruit = (from list in TheList
             join fruit in
               (from fr in MyDc.HarvestTimes
                group fr by fr.FruitID into fg
                where !fg.Any(f => f.RipeFactor != 2)
                select fg)
             on list.FruitID equals fruit.Key
             select new MyObject{... }).ToList();

更新 - 如果您只想返回不同的FruitID列表,则需要选择fg.Key而不是fg

var fruit = (from list in TheList
             join fruit in
               (from fr in MyDc.HarvestTimes
                group fr by fr.FruitID into fg
                where !fg.Any(f => f.RipeFactor != 2)
                select fg.Key)
              on list.FruitID equals fruit
              select new MyObject{... }).ToList();