簡體   English   中英

Lambda表達式:包含列表的Where子句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM