我有看起来像这样的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();