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)
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)
| 归档时间: |
|
| 查看次数: |
16865 次 |
| 最近记录: |