Linq RavenDB查询中出现“无法将Lambda表达式转换为委托类型”错误

Linq RavenDB查询中出现“无法将Lambda表达式转换为委托类型”错误,linq,ravendb,Linq,Ravendb,我有一个RavenDb文档,如下所示: { "ParentId": null, "Order": 10, "Url": "/sandbox", "Rows": [ { "InstanceId": "2771a0d7-7f3f-4854-a3ba-27f25f88a45e", "CSSClass": null, "Columns": [ { "InstanceId": "b91495

我有一个RavenDb文档,如下所示:

{
  "ParentId": null,
  "Order": 10,
  "Url": "/sandbox",
  "Rows": 
  [
    {
      "InstanceId": "2771a0d7-7f3f-4854-a3ba-27f25f88a45e",
      "CSSClass": null,
      "Columns": 
      [
        {
          "InstanceId": "b91495f5-b770-4da7-8073-ad3bd8221ca8",
          "CSSClass": null,
          "Span": 3,
          "CMSModuleInstanceSettings": 
          [
            {
              "$type": "ModuleHTML.Models.ModuleHTMLInstanceSettings, ModuleHTML",
              "IsActive": false,
              "ShowAuthor": false,
              "ShowDate": false,
              "ShowCommentsCount": false,
              "ShowLast2Comments": false,
              "CMSModuleInstanceId": 417,
              "ContainerClass": "default",
              "ModuleType": "ModuleHTML",
              "DisplayType": "Summary"
            },
            {
              "$type": "ModuleHTML.Models.ModuleHTMLInstanceSettings, ModuleHTML",
              "IsActive": false,
              "ShowAuthor": false,
              "ShowDate": false,
              "ShowCommentsCount": false,
              "ShowLast2Comments": false,
              "CMSModuleInstanceId": 545,
              "ContainerClass": "default",
              "ModuleType": "ModuleHTML",
              "DisplayType": "Summary"
            }
          ],
          "Id": 0,
          "Name": null,
          "CreatedOn": "0001-01-01T00:00:00.0000000",
          "CreatedBy": 0,
          "LastModifiedOn": "0001-01-01T00:00:00.0000000",
          "LastModifiedBy": 0
        },
        ...
      ],
      ...
    },
    ...
  ],
  ...
}
  var page = documentSession.Query<CMSPage>()
         .SingleOrDefault(p => p.Id == pageId);
我想检索页面文档,包括行、列,然后只包括活动的CMSModuleInstanceSettings

我试过:

var page = documentSession.Query<CMSPage>()
             .SingleOrDefault(p => p.Id == pageId)
             .Rows
             .Any(x => x.Columns
               .Any(z => z.CMSModuleInstanceSettings
                 .Where(m => m.IsActive == true)));
但它的回报是:

Error 1 Cannot convert lambda expression to delegate type
'System.Func<CMS.Models.CMSColumn,bool>' because some of 
the return types in the block are not implicitly convertible 
to the delegate return type

我做错了什么?

你知道你实际上是在做一个查询,然后是一个内存过滤器,对吗

按如下方式拆分:

{
  "ParentId": null,
  "Order": 10,
  "Url": "/sandbox",
  "Rows": 
  [
    {
      "InstanceId": "2771a0d7-7f3f-4854-a3ba-27f25f88a45e",
      "CSSClass": null,
      "Columns": 
      [
        {
          "InstanceId": "b91495f5-b770-4da7-8073-ad3bd8221ca8",
          "CSSClass": null,
          "Span": 3,
          "CMSModuleInstanceSettings": 
          [
            {
              "$type": "ModuleHTML.Models.ModuleHTMLInstanceSettings, ModuleHTML",
              "IsActive": false,
              "ShowAuthor": false,
              "ShowDate": false,
              "ShowCommentsCount": false,
              "ShowLast2Comments": false,
              "CMSModuleInstanceId": 417,
              "ContainerClass": "default",
              "ModuleType": "ModuleHTML",
              "DisplayType": "Summary"
            },
            {
              "$type": "ModuleHTML.Models.ModuleHTMLInstanceSettings, ModuleHTML",
              "IsActive": false,
              "ShowAuthor": false,
              "ShowDate": false,
              "ShowCommentsCount": false,
              "ShowLast2Comments": false,
              "CMSModuleInstanceId": 545,
              "ContainerClass": "default",
              "ModuleType": "ModuleHTML",
              "DisplayType": "Summary"
            }
          ],
          "Id": 0,
          "Name": null,
          "CreatedOn": "0001-01-01T00:00:00.0000000",
          "CreatedBy": 0,
          "LastModifiedOn": "0001-01-01T00:00:00.0000000",
          "LastModifiedBy": 0
        },
        ...
      ],
      ...
    },
    ...
  ],
  ...
}
  var page = documentSession.Query<CMSPage>()
         .SingleOrDefault(p => p.Id == pageId);

您现在从哪里得到错误?

您知道您实际上是在执行一个查询,然后是内存中的筛选器,对吗

按如下方式拆分:

{
  "ParentId": null,
  "Order": 10,
  "Url": "/sandbox",
  "Rows": 
  [
    {
      "InstanceId": "2771a0d7-7f3f-4854-a3ba-27f25f88a45e",
      "CSSClass": null,
      "Columns": 
      [
        {
          "InstanceId": "b91495f5-b770-4da7-8073-ad3bd8221ca8",
          "CSSClass": null,
          "Span": 3,
          "CMSModuleInstanceSettings": 
          [
            {
              "$type": "ModuleHTML.Models.ModuleHTMLInstanceSettings, ModuleHTML",
              "IsActive": false,
              "ShowAuthor": false,
              "ShowDate": false,
              "ShowCommentsCount": false,
              "ShowLast2Comments": false,
              "CMSModuleInstanceId": 417,
              "ContainerClass": "default",
              "ModuleType": "ModuleHTML",
              "DisplayType": "Summary"
            },
            {
              "$type": "ModuleHTML.Models.ModuleHTMLInstanceSettings, ModuleHTML",
              "IsActive": false,
              "ShowAuthor": false,
              "ShowDate": false,
              "ShowCommentsCount": false,
              "ShowLast2Comments": false,
              "CMSModuleInstanceId": 545,
              "ContainerClass": "default",
              "ModuleType": "ModuleHTML",
              "DisplayType": "Summary"
            }
          ],
          "Id": 0,
          "Name": null,
          "CreatedOn": "0001-01-01T00:00:00.0000000",
          "CreatedBy": 0,
          "LastModifiedOn": "0001-01-01T00:00:00.0000000",
          "LastModifiedBy": 0
        },
        ...
      ],
      ...
    },
    ...
  ],
  ...
}
  var page = documentSession.Query<CMSPage>()
         .SingleOrDefault(p => p.Id == pageId);

您现在从哪里得到错误?

我确信有更好的方法,但这就是我最终要做的

var page = documentSession.Load<CMSPage>(pageId);

foreach (var row in page.Rows)
            {
                foreach (var column in row.Columns)
                {
                    var settings = column.CMSModuleInstanceSettings.ToList();
                    settings.ForEach(x => settings.Remove(x));
                    column.CMSModuleInstanceSettings = settings;
                }
            }

我相信有更好的方法,但这就是我最后做的

var page = documentSession.Load<CMSPage>(pageId);

foreach (var row in page.Rows)
            {
                foreach (var column in row.Columns)
                {
                    var settings = column.CMSModuleInstanceSettings.ToList();
                    settings.ForEach(x => settings.Remove(x));
                    column.CMSModuleInstanceSettings = settings;
                }
            }

嗨,艾恩德,谢谢你的回复。顺便说一句,乌鸦真是太棒了!错误1无法将lambda表达式转换为委托类型“System.Func”,因为块中的某些返回类型无法隐式转换为委托返回类型;第二个错误:错误2无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“bool”。最终,我仍希望返回页面对象,但具有已筛选子对象。换句话说,我不想要行集合。这有可能吗?如果您确实想要子对象,那么Any不是您想要的。我猜你是LINQ的新手。你可能想要。一路下来。我会将原始页面投影到一个已过滤子集合的克隆中。嗨,Ayende,谢谢你的回复。顺便说一句,乌鸦真是太棒了!错误1无法将lambda表达式转换为委托类型“System.Func”,因为块中的某些返回类型无法隐式转换为委托返回类型;第二个错误:错误2无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“bool”。最终,我仍希望返回页面对象,但具有已筛选子对象。换句话说,我不想要行集合。这有可能吗?如果您确实想要子对象,那么Any不是您想要的。我猜你是LINQ的新手。你可能想要。一路下来。我会将原始页面投影到已筛选子集合的克隆中。请小心修改原始文档及其子对象,因为如果您将其保存回Raven,则将这些更改保存到数据库。请小心修改原始文档及其子对象,因为如果您保存回Raven,您将把这些更改保存到数据库中。