LinqToSql过滤实体集

时间:2012-02-16 23:54:54

标签: linq-to-sql windows-phone-7

我正在使用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);
}

我得到了父母,但我只得到有孙女的孩子。我想要父母,所有的孩子(即使他们没有女孙子或没有孙子孙女),也只有女孙子。

2 个答案:

答案 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;

我已经对数据模型中的名称做了一些假设,但是你明白了。 : - )