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

Tik*_*kes 6 c# linq lambda

所以我有这样的事情:

var myObj = db.SomeObject
              .Include("Tasks")
              .SingleOrDefault(x => x.Id == someObjectId);

if (myObj != null)
{
    myObj.Tasks = myObj.Tasks.OrderBy(x => x.Number).ToList();
}
Run Code Online (Sandbox Code Playgroud)

在这里,我希望能够where在我的Include上添加一个condition(),例如: .where task.IsDeleted == false

因此我没有找到解决方案.

我知道我可以where和我在哪里订购任务一起使用,但是这不会在数据库上运行,而是使用内存.我希望它在数据库上运行.

这里有谁知道我怎么做到这一点?如果是这样,是否还有办法将order by条件放入包含的任务列表中?

Nic*_*ler 5

要做到这一点是EF,您需要指定带有Select子句的投影.

像这样的东西只会从db获得你想要的数据:

var anonymous = db.SomeObject.Where( x => x.Id == someObjectId )
  .Select( x => new
    {
      SomeObject = x,
      Tasks = x.Tasks
        .Where( o => !o.IsDeleted )
        .OrderBy( o => ... )
    }
  )
  .SingleOrDefault()
;
Run Code Online (Sandbox Code Playgroud)

您最终将获得匿名类型的实例,但您可以轻松地在客户端上修复它:

MyObject myObject = anonymous.SomeObject;
myObject.Tasks = anonymous.Tasks;
Run Code Online (Sandbox Code Playgroud)


Sky*_*kyp 5

像这样的东西,通过对其子集合进行过滤和排序来回收原始对象.

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();
Run Code Online (Sandbox Code Playgroud)

它实际上丢失了最后一个选择中的活动集合,因此您可以这样做:

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;
Run Code Online (Sandbox Code Playgroud)