我在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的新手
答案 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实现这一目标
是的,在我看来,我的图书馆使用与投影类似的解决方案
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));