2016-03-08 78 views
2

我正在尝试编写一个linq查询,它将排除具有某个整数ID的子记录的任何记录。在Linq中选择子集

我查询反对看起来像类:

public class Group { 
    public ICollection<Item> { get; set; } // This is the child collection 
} 

public class Item { 
    public int Id { get; set; } 
} 

我的资料库查询方法是:

public ICollection<Group> Get(int itemId) { 

     return from c in Set.... // Set is an EF collection of all Groups 
} 

我想回到所有Groups没有在他们的Items收集的ItemId等于itemId传递给该方法。

不知道如何在Linq中最有效地编写它。

回答

2

这将工作(我喜欢上面的查询语法方法的语法比其他任何东西我使用方法的语法虽然连接):

var result = db.Groups.Where(g => !g.Items.Any(i => i.Id == itemID)).ToList(); 

选择不含有与Id一个项目的所有组等于itemID。顺便说一下,我注意到你的代码中有Set?这是否意味着你已经提前获取了所有的组或者什么(在内存中过滤)?最简单的方法是使用您的DbContext并从那里访问您的表格。

+0

谢谢 - 脑冻结日。 Set来自DbContext,并且没有预加载 - 长话短说,但看起来像是一个泛型基类的结果。 – Graham

+0

@Graham发生了,它仍然在一天的早些时候;-)(至少对我而言) –

0

也可以通过聚集,在那里你可以创建需要排除标识的列表实现,看看下面的工作例如,使用LinqPad创建的,你必须删除转储联系,如果试图在Visual Studio

void Main() 
{ 
    var groups = Group.GetGroups(); 

    List<int> excludeList = new List<int> {4,3,0}; 

    var result = excludeList.Aggregate(groups,(currentGroup,ItemId) => currentGroup.Where(x => !x.Items.Any(y => y.Id == ItemId))); 

    result.Dump(); 
} 


public class Group 
{ 
    public ICollection<Item> Items { get; set; } // This is the child collection 

    public static IEnumerable<Group> GetGroups() 
    { 
     Item i1 = new Item {Id = 1}; 

     Item i2 = new Item {Id = 2}; 

     Item i3 = new Item {Id = 3}; 

     Item i4 = new Item {Id = 4}; 

     Group g1 = new Group { Items = new List<Item> {i1,i2 }}; 

     Group g2 = new Group { Items = new List<Item> {i3,i4 }}; 

     return new List<Group> {g1,g2}; 
    } 
} 

public class Item 
{ 
    public int Id { get; set; }