使用 LINQ 到 SQL 查询联接列表



我有看起来像这样的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 子句方面遇到了一些麻烦。我如何只获得成熟因子始终为 2 的水果。例如,水果 3 的成熟因子为 2,但也有 4,而只有水果 4 只有 2。我尝试使用包含,但两种水果都出现了。

感谢您的建议。

假设 HaverstTime 和 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);

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

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

更新2:做同样的事情,考虑到成熟因子 = 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);

我认为这会起作用

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。键而不是 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();

相关内容

  • 没有找到相关文章