Lambda表达式:用于Include列表的Where子句
本文关键字:Where 子句 列表 Include 表达式 用于 Lambda | 更新日期: 2023-09-27 18:07:26
所以我得到了这样的内容:
var myObj = db.SomeObject
.Include("Tasks")
.SingleOrDefault(x => x.Id == someObjectId);
if (myObj != null)
{
myObj.Tasks = myObj.Tasks.OrderBy(x => x.Number).ToList();
}
在这里,我希望能够在我的Include上放置一个条件(where
),例如:.where task.IsDeleted == false
到目前为止我还没有找到解决办法。
我知道我可以将where
与我订购任务的地方一起使用,但这不是在数据库上运行,而是使用内存。我想让它在数据库上运行。
这里有人知道我怎么做这个吗?如果是这样,是否还有一种方法可以将order by
条件放入包含的任务列表中?
像这样,返回原始对象及其子集合经过过滤和排序。
SomeObject a = db.SomeObjects.Where(x => x.Id == someobjectid)
.Select(
x =>
new
{
someObject = x,
task = x.Tasks.Where(task => task.IsDeleted == false)
.OrderBy(task => whatever)
})
.Select(x => x.someObject).Single();
它实际上失去了上次选择的活动集合,所以你可以这样做:
SomeObject a = db.SomeObjects.Where(x => x.Id == someobjectid)
.Select(
x =>
new
{
someObject = x,
task = x.Tasks.Where(task => task.IsDeleted == false)
.OrderBy(task => whatever)
});
return a.FirstOrDefault().someObject;
要做到这一点,您需要使用Select
子句指定投影。
像这样的代码将从数据库中获取您想要的数据:
var anonymous = db.SomeObject.Where( x => x.Id == someObjectId )
.Select( x => new
{
SomeObject = x,
Tasks = x.Tasks
.Where( o => !o.IsDeleted )
.OrderBy( o => ... )
}
)
.SingleOrDefault()
;
你最终会得到一个匿名类型的实例,但是你可以很容易地在客户端修复它:
MyObject myObject = anonymous.SomeObject;
myObject.Tasks = anonymous.Tasks;
简单的回答是:你不能那样做。
为什么?因为你查询的是SomeObject
。
每个返回的SomeObject
都包含所有引用的数据,因为如果它不这样做,它就不代表数据库中的实际对象。
分开来怎么样:
var myObj = db.SomeObject
.SingleOrDefault(x => x.Id == someObjectId);
var tasks = db.SomeObject
.Where(x => x.Id == someObjectId)
.SelectMany(x => x.Tasks)
.Where(x => !x.Deleted);