我有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,但两种水果都出现了。
感谢您的建议。
答案 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();