[英]Lambda expression: Where clause for Include list
所以我有這樣的事情:
var myObj = db.SomeObject
.Include("Tasks")
.SingleOrDefault(x => x.Id == someObjectId);
if (myObj != null)
{
myObj.Tasks = myObj.Tasks.OrderBy(x => x.Number).ToList();
}
在這里,我希望能夠把一個狀態( where
)我包括,例如: .where task.IsDeleted == false
因此我沒有找到解決方案。
我知道我可以使用where
以及我在哪里訂購任務,但是這不會在數據庫上運行,而是使用內存。 我希望它在數據庫上運行。
這里有誰知道我怎么做到這一點? 如果是這樣,是否還有一種方法可以將條件按order by
放入包含的任務列表中?
要執行此操作是EF,您需要使用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 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;
簡單的答案是:你做不到。
為什么? 因為您查詢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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.