如何筛选可选字段

时间:2016-02-10 11:24:26

标签: linq ravendb

我有一个解决方案类:

public class Solution{
   public bool? IsTemplate{get;set;}
   public string createdBy{get;set;}

}

某些文档将IsTemplate字段设置为true或false,许多文档没有。

我如何获得将其设置为false的解决方案以及根本没有该字段的解决方案(旧版文档)?

我试图通过IsTemplate过滤为null,false,null或false,但我从未找回过没有IsTemplate字段的解决方案。 我必须工作的唯一方法是以下,但它很丑陋。

 using (IDocumentSession session = DocumentStoreHolder.Store.OpenSession())
            {
                var ret= session.Query<Solution>().Where(x => 
                 x.createdBy.Equals(owner)) //an user's solutions
                .ToList()
                .Where(s => s.IsTemplate == null || s.IsTemplate == false)
                .ToList();
                return ret;
            }

3 个答案:

答案 0 :(得分:1)

var ret = session.Query<Solution>()
     .Where(x => x.createdBy.Equals(owner)
         && (!x.IsTemplate.HasValue || x.IsTemplate.Value == false))
     .ToList();

答案 1 :(得分:0)

您需要创建一个查看缺失属性的索引:

from x in docs.Solutions
select new
{
  IsTemplate = x.IsTemplate == true // if this is null, will return false
}

然后查询。

答案 2 :(得分:-1)

假设使用了第一个ToList,因为此“文档商店”提供的IQueryable实现因某些原因不支持您的查询,您无法做更多事情。

我建议:

  • 与提供商一起打开错误报告以实现所需的功能,或者如果您有权访问代码库,则自行添加。
  • 在此期间,请使用AsEnumerable代替ToList,以便在继续之前不缓冲整个数据集。

Where条款似乎相当简单。如果你的应用程序在不存在的属性和它是假的之间没有语义差异(听起来像你的描述),我会考虑将缺席条件映射到错误条件并使用不允许的目标数据结构可以IsTemplate

        using (IDocumentSession session = DocumentStoreHolder.Store.OpenSession())
        {
            return session.Query<Solution>()
                .Where(x => x.createdBy.Equals(owner))
                .AsEnumerable()
                .Select(s => new {
                    IsTemplate = s.IsTemplate ?? false,
                    CreatedBy = s.CreatedBy })
                .ToList();
        }

请注意,生成的对象是匿名的,我们将其返回;这使我们无法使用良好类型的方法签名。因此,我肯定定义另一个Solution类。

您可以自然地看到设计:您现在有两种Solution类型。一个用于域,由应用程序使用,并且完全不关心遗留条件,如“IsTemplate”为空(它从来不是从应用程序的角度来看),另一个仅用于粘合遗留过渡期间的条件。确保对它们进行组织并对其进行充分命名,以便明确哪些用于什么(利用.NET命名空间,这就是他们擅长的!)。