6

だから私はこのようなものを得ました:

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もしそうなら、タスクの含まれるリストに条件を入れる方法もありますか?

4

4 に答える 4

5

これを 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;
于 2013-04-04T11:58:04.037 に答える
2

簡単な答えは次のとおりです。それはできません。

なんで?クエリを実行するためですSomeObject
返されたそれぞれにSomeObjectは、参照されたすべてのデータが含まれています。そうでない場合、データベース内の実際のオブジェクトを表していないからです。

于 2013-04-04T11:51:55.560 に答える
1

それらを別々に入手するのはどうですか:

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);
于 2013-04-04T11:57:23.643 に答える