实体框架包括过滤器子集合

时间:2017-04-04 07:54:52

标签: c# asp.net-mvc entity-framework linq 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();

在上面的代码"内部"是另一个项目清单。现在我需要过滤内部项目。我只需要内部项目,过滤条件为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的新手

3 个答案:

答案 0 :(得分:6)

免责声明:我是该项目的所有者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&amp; 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

不幸的是,即使最新的EF Core版本仍然存在投影问题并导致N + 1查询。当新版本(稳定版或预发布版)不再出现​​此问题时,该功能将可用。

答案 1 :(得分:0)

我能够在EF Core中实现这一目标。我敢肯定,EF6中也适用相同的概念。

简化您的示例:

for(i in 1:nSim){
  plM = summary(lm(rowMeans(df ~ pred))$coef[2,4]
  pLMM = ...
  pGEE = ...}

答案 2 :(得分:-4)

您可以在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));