我正在使用Linq To Sql编写WP7应用程序。我使用过Linq,但这是我第一次使用Linq到Sql。我在EntitySet中过滤数据时遇到问题。我可能做错了我不知道。我现在所做的工作,但我需要过滤其中一个EntitySet。
我有4张桌子。 Parent,Child,Grandchild和ParentChild链接表。当我查询ParentChild时,我回到ParentChild实体,我可以很好地遍历Parent,Child和Grandchild实体。我希望能够做的是过滤孙子实体。
假设我在父表中有父亲和母亲。然后我在儿童餐桌上有一个儿子和女儿。然后是孙子表中的孙子和孙女。当然有正常的关联等。
我想要归还父亲,这也让我得到了所有关联的表格。我遇到的问题是对孙子进行过滤。让我们说我只想要孙子,并有一个性的领域。我怎样才能做到这一点?我似乎无法弄明白。
以下是我正在使用的代码,它可以正常工作,但它会吸引所有的孙子。
IQueryable<ParentChild> parentChild = from ParentChild c in DataContext.ParentChild
where c.ParentId == this.parentId
select c;
foreach (Grandchild grandchild in parentChild.SelectMany(parent => parent.Child.Grandchild))
{
Console.WriteLine(grandchild.Name);
}
所以,如果我这样做:
IQueryable<ParentChild> parentChild = from ParentChild c in DataContext.ParentChild
where c.ParentId == this.parentId && c.Child.Grandchild.Any(a => a.Sex == "F")
select c;
foreach (Grandchild grandchild in parentChild.SelectMany(parent => parent.Child.Grandchild))
{
Console.WriteLine(grandchild.Name);
}
我得到了父母,但我只得到有孙女的孩子。我想要父母,所有的孩子(即使他们没有女孙子或没有孙子孙女),也只有女孙子。
答案 0 :(得分:1)
经过多次试验和错误搜索后,我找到了答案。我必须使用AssociateWith选项。
DataLoadOptions dataLoadOptions = new DataLoadOptions();
dataLoadOptions.AssociateWith<Child>(c => c.Grandchild.Where(p => p.Sex == "F"));
this.DataContext.LoadOptions = dataLoadOptions;
答案 1 :(得分:0)
只要您在SQL中正确设置了外键; LINQ to SQL将能够为您提供与您的外键关系匹配的关联属性。
如果设置了外键,您将能够执行以下操作...
var query = from p in DataContext.Parent
//make sure they have at least 1 female grandchild
where p.GrandChilds.Any(gc => gc.IsFemale)
select p;
我已经对数据模型中的名称做了一些假设,但是你明白了。 : - )