可能有人可以帮我解决这个问题(至少对我而言)。
假设我有以下数据(在DB中)
Tab1 (id_t1): Item
(1)
(2)
(3)
Tab2 (id_t2, id_t1): Group
(4, 1)
(5, 1)
(6, 2)
(7, 3)
Tab3 (id_t3, id_t2, v): GroupField
(10, 4, 100)
(11, 4, 300)
(12, 5, 200)
(13, 6, 100)
(14, 6, 200)
(15, 7, 100)
(16, 7, 300)
现在我想选择包含所有特定GroupFields的所有项目。
EG。我有v = list(100,200)
我想回到1,2而不是3
1因为Group4保持Field10,v = 100,Group5保持Field12,v = 200
和2因为Group6保持Field13,v = 100,Field14保持v = 200
在Linq这样的事情可能吗? (我已经尝试了不同的方式(任何/所有)但到目前为止没有成功。
我不明白如何克服这个“字段可以在任何一个群体而不是一个群体中”...
我甚至不知道如何在不使用临时表/游标的情况下在一个命令中在SQL中执行此操作。
_rene
答案 0 :(得分:2)
试试这个:
var result =
groups.Join(fields, o => o.Id, i => i.GroupId,
(o, i) => new { Group = o, Field = i } )
.GroupBy(x => x.Group.ItemId)
.Where(x => values.All(y => x.Any(z => z.Field.Value == y)))
.Select(x => x.Key)
.Distinct();
使用以下类:
class Group
{
public Group(int id, int itemId)
{
Id = id;
ItemId = itemId;
}
public int Id { get; set; }
public int ItemId { get; set; }
}
class GroupField
{
public GroupField(int id, int groupId, int value)
{
Id = id;
GroupId = groupId;
Value = value;
}
public int Id { get; set; }
public int GroupId { get; set; }
public int Value { get; set; }
}
以及以下初始化:
var groups = new [] { new Group(4, 1), new Group(5, 1),
new Group(6, 2), new Group(7, 3) };
var fields = new [] { new GroupField(10, 4, 100),
new GroupField(11, 4, 300),
new GroupField(12, 5, 200),
new GroupField(13, 6, 100),
new GroupField(14, 6, 200),
new GroupField(15, 7, 100),
new GroupField(16, 7, 300)
};
var values = new [] { 100, 200 };