Ish*_*ohn 9 c# linq asp.net-mvc entity-framework entity-framework-6
我在LINQ查询中为包含的项添加一些过滤条件有些困难.我的查询是这样的
var item = _Context.Order.Include("Inner")
.Include("Inner.first")
.Include("Inner.second")
.Where(x => ( !(x.IsDeleted) && (x.IsActive) &&
(x.itemid == id))).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,"Inner"是另一个项目列表.现在我需要过滤内部项目.我只需要内部项目,过滤条件为inner.isDeleted = true.
查询应该返回一个类,
public class Order
{
public string Name { get; set; }
public List<InnerDetails> Inner{ get; set; }
public bool IsDeleted { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和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; }
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议我采用更好的方法,因为我是LINQ和EF的新手
免责声明:我是项目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();
Run Code Online (Sandbox Code Playgroud)
注意:您不能混合Include和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();
Run Code Online (Sandbox Code Playgroud)
注意:代码尚未经过测试
编辑:回答评论
我在EF Core中遇到过这个问题.您是否也要在EF + Core版本中实现IncludeFilter
不幸的是,即使最新IncludeFilter版本仍然存在投影问题并导致N + 1查询.当新版本(稳定版或预发布版)不再出现此问题时,该功能将可用.
| 归档时间: |
|
| 查看次数: |
11367 次 |
| 最近记录: |