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

时间:2012-06-27 23:48:30

标签: linq ravendb

我有一个如下所示的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
        },
        ...
      ],
      ...
    },
    ...
  ],
  ...
}

我希望检索页面文档并包含行,列,然后只包含活动的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

我做错了什么?

2 个答案:

答案 0 :(得分:3)

你知道你实际上正在进行查询,然后是内存过滤器,对吗?

将它拆分为:

  var page = documentSession.Query<CMSPage>()
         .SingleOrDefault(p => p.Id == pageId);

  var rows =             page.Rows
         .Any(x => x.Columns
           .Any(z => z.CMSModuleInstanceSettings
             .Where(m => m.IsActive == true)));

你现在在哪里得到错误?

答案 1 :(得分:1)

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

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;
                }
            }