2010-02-01 4 views
1

J'ai un code comme celui-ci en essayant d'obtenir des données d'une table de documents basés sur des filtres passés dans (ContentRef et typeref) ...omettent types nullables dans LINQ-requête sql

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

si l'ContentRef ou TypeRef sont null alors je ne veux pas qu'il fasse un contrôle pour si son null je veux juste qu'il soit ignoré.

par exemple, si les deux sont nuls ma méthode doit retourner le equiavalent de

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

Comment puis-je faire?

Répondre

0

Essayez ceci:

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

Lorsque ContentRef est nulle, la partie document.ContentRef == ContentRef ne sera pas évaluée.

0

Avec exécution différée, vous pouvez construire votre requête de cette manière car l'exécution ne se produit que lorsque GetEnumerator est appelée.

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