省略linq-sql查询中的可空类型

时间:2010-02-01 14:31:08

标签: c# linq-to-sql

我有一些这样的代码尝试根据传入的一些过滤器(ContentRef和TypeRef)从Documents表中获取一些数据......

 public IQueryable<Document> GetFilteredDocuments(bool archived, int? ContentRef, int? TypeRef)
            {
                return from document in db.Documents
                       where document.IsArchived == archived
                       && (document.ContentRef == ContentRef)
                       && (document.TypeRef == TypeRef )
                       select document;
            }

如果ContentRef或TypeRef为null,那么我不希望它检查是否为null,我只是想忽略它。

例如,如果两者都为null,我的方法应该返回等价的

 return from document in db.Documents
                       where document.IsArchived == archived
                       select document;

我该怎么做?

2 个答案:

答案 0 :(得分:0)

试试这个:

public IQueryable<Document> GetFilteredDocuments(bool archived, int? ContentRef, int? TypeRef)
{
    return from document in db.Documents
           where document.IsArchived == archived
           && (ContentRef == null || document.ContentRef == ContentRef)
           && (TypeRef == null || document.TypeRef == TypeRef )
           select document;
}

当ContentRef为null时,不会评估document.ContentRef == ContentRef部分。

答案 1 :(得分:0)

使用延迟执行,您可以像这样构造查询,因为只有在调用GetEnumerator时才会执行。

public IQueryable<Document> GetFilteredDocuments(bool archived, int? ContentRef, int? TypeRef)
{
    IQueriable<Document> docs = db.Documents.Where(d => d.IsArchived == archived);
    if (ContentRef != null)
       docs = docs.Where(d => d.ContentRef == ContentRef);
    if (TypeRef  != null)
       docs = docs.Where(d => d.TypeRef == TypeRef);
    return docs;
}