过滤 IQueryable 子列表

Rya*_*ode 5 c# linq entity-framework filtering

使用实体框架,但这可能无关如果我有一个 Iqueryable,如何过​​滤子列表并使其保持 IQueryable,这样它就不会到达数据库?

如果我有 10 个项目,每个项目有 3 个子项目,我该如何过滤它,以便返回所有 10 个项目,并且它们的子项目被过滤到 id = 1 的位置?

类 Item 有大约 20 个属性,因此出于维护方面的考虑,我不想对每个属性都使用投影。

items = items.select(??);//how to do this so items are returned, and their children are filtered?

class SubItem
{ private int ID { get; set; }
}
class Item 
{
private List<SubItem> SubItems { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ler 4

Items我将您的问题解释为您无论如何都想返回所有内容,但您想过滤SubItems. 对于IQueryable. 如果需要,您必须使用 select 语句来选择一个新对象。

方案一:单独返回数据

var itemsAndSubItems = items
    .Select(item => new 
        {
            Item = item,
            SubItems = item.SubItems.Where(sub => sub.ID = 1)
        }
    );
Run Code Online (Sandbox Code Playgroud)

或者如果您不介意将项目加载到内存中:

IEnumerable<Item> = items
    .Select(item => new 
        {
            Item = item,
            SubItems = item.SubItems.Where(sub => sub.ID = 1)
        }
    )
    .ToList()
    .Select(row => 
        { 
            var item = row.Item;
            item.SubItems = row.SubItems;
            return item;
        }
    );
Run Code Online (Sandbox Code Playgroud)

选项 2:返回类的新实例(您似乎不想这样做)

IQueryable<Item> items = items
    .Select(item => new Item 
        { 
            SubItems = item.SubItems.Where(sub => sub.ID == 1),
            OtherProp = item.OtherProp
            /*etc for the other properties on Item*/
        }
    );
Run Code Online (Sandbox Code Playgroud)

选项 3:向您的类添加另一个属性。我至少推荐这个。请注意,当您访问 SubItemsWithIdOne 时,您的查询仍将返回此处的所有子项

class Item 
{
    private List<SubItem> SubItems { get; set; }
    private List<SubItem> SubItemsWithIdOne 
    {
        get 
        {
            return this.SubItems.Where(sub => sub.ID == 1); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

SubItem选项 4:添加一个引用其父级的属性Item。然后返回一个列表SubItem。这样您就可以同时SubItems满足Items您的标准。

...如果您正在与您合作,IEnumerable您可以这样做:

IEnumerable items = items
    .Select(item =>
        {
            item.SubItems.Where(sub => sub.ID = 1);
            return item;
        }
    );
Run Code Online (Sandbox Code Playgroud)