包括过滤器子集合[重复]
Posted
技术标签:
【中文标题】包括过滤器子集合[重复]【英文标题】:Include filter child collection [duplicate] 【发布时间】:2017-04-04 07:54:52 【问题描述】:我在为我的 LINQ 查询中包含的项目添加一些过滤条件时遇到了一些困难。我的查询是这样的
var item = _Context.Order.Include("Inner")
.Include("Inner.first")
.Include("Inner.second")
.Where(x => ( !(x.IsDeleted) && (x.IsActive) &&
(x.itemid == id))).FirstOrDefault();
在上面的代码中,“Inner”是另一个项目列表。现在我需要过滤内部项目。我只需要过滤条件为 inner.isDeleted = true 的内部项目。
查询应该返回一个类似的类,
public class Order
public string Name get; set;
public List<InnerDetails> Inner get; set;
public bool IsDeleted get; set;
和 InnerDetails 类类似
public class InnerDetails
public string Sample get; set;
public bool IsDeleted get; set;
public int firstId get; set;
public int secondID get; set;
public First first get; set;
public Second second get; set;
由于我是 LINQ 和 EF 的新手,任何人都可以建议我更好的方法吗?
【问题讨论】:
您到底想过滤什么 - 您是想仅包含 order.inner.isdeleted 的 order.inner 中的条目,还是要删除整个记录,例如整行订单那不符合条件?如果是第二个,如果你在 order.inner 中有 2 个条目,一个是 isDeleted = true,一个是 isDeleted - false @Alex:我在问题中提到'我只需要带有过滤条件的内部项目inner.isDeleted = true。',即我只需要包含已删除的内部记录(inner.isDeleted = true) .这仅用于内部记录,这不会影响外部记录。 您似乎正在尝试过滤嵌套列表。我认为这个问题可以帮助你***.com/questions/25183685/… 和这个***.com/questions/7079378/… 什么是 Inner.first 和 Inner.second ?? InnerDetails 下的两个不同对象 【参考方案1】:免责声明:我是项目的所有者Entity Framework Plus
EF+ Query IncludeFilter 功能允许过滤相关实体。
var item = _Context.Order
.IncludeFilter(x => x.Inner.Where(y => y.IsDeleted))
.IncludeFilter(x => x.Inner.Where(y => y.IsDeleted).Select(y => y.first))
.IncludeFilter(x => x.Inner.Where(y => y.IsDeleted).Select(y => y.second))
.Where(x => ( !(x.IsDeleted) && (x.IsActive) &&
(x.itemid == id))).FirstOrDefault();
注意:不能混用 Include 和 IncludeFilter。
维基:EF+ Query IncludeFilter
编辑:回答子问题
但我们只能使用 EF 来实现这一点
是的,在后台,我的库使用与投影类似的解决方案
var item = _Context.Order.Select(x => new
Order = x,
Inner = x.Inner.Where(y => y.IsDeleted),
first = x.Inner.Where(y => y.IsDeleted).Select(y => y.first)
second = x.Inner.Where(y => y.IsDeleted).Select(y => y.second)
)
.Where(x => ( !(x.IsDeleted) && (x.IsActive) && (x.itemid == id)))
.FirstOrDefault()
.Select(x => x.Order)
.FirstOrDefault();
注意:代码未经测试
编辑:回复评论
我在 EF Core 中遇到了这个问题。是不是也要在 EF+Core 版本中实现 IncludeFilter
从 v1.10.0 开始,EF Core 2.x 现在支持IncludeFilter
见:Release Note
编辑:回答子问题
过滤后我如何才能包含
我们还没有ThenInclude
。
因此,您需要再次使用 IncludeFilter
和所有过滤器并浏览要包含的列表或实体。
【讨论】:
请问我们需要添加 EF+ 引用还是什么? 是的,您需要添加引用这个库并添加“using Z.EntityFramework.Plus”命名空间才能使用 IncludeFilter 功能。 但是我们只能使用 EF 来实现。在我的回答中 不幸的是 IncludeFilter 有很多限制,我无法让它工作 我在 EF Core 中遇到了这个问题。您是否还要在 EF+Core 版本中实现 IncludeFilter? ?【参考方案2】:您可以在 EF Core 本身中实现这一点:
var item =
ctx.Order.Include("Inner")
.Select(x => x.Inner
.Where(innerItem => innerItem.IsDeleted))
.FirstOrDefault();
或者,
var item =
ctx.Order.Include(o=> o.Inner
.Where(x => x.IsDeleted));
【讨论】:
以上是关于包括过滤器子集合[重复]的主要内容,如果未能解决你的问题,请参考以下文章