2010-04-06 5 views
0

comment ensemble distinct à cette requêteLINQ champ distinct

return _dataContext.ProjectPictures.Include("Projects").Include("ProjectPictureTypes").Where(p => p.ProjectPictureTypes.Id == 1).ToList(); 

i besoin de quelque chose comme

return _dataContext.ProjectPictures.Include("Projects").Include("ProjectPictureTypes").Where(p => p.ProjectPictureTypes.Id == 1).Distinct(p=>p.Projects.Id).ToList(); 
+0

ce que voulez-vous ici distinct? Aussi, il est préférable de ne pas utiliser autant d'includes à la fois, ils font une requête à db maladroit – vittore

+0

Que voulez-vous retourner? Une liste d'ID de projet distincts? –

+0

je veux obtenir la liste des objets avec distinct par un champ – kusanagi

Répondre

1

En supposant que vous avez vos relations clés étrangères mis en place la façon dont vous les voulez dans la base de données, et en supposant que vos classes LINQ to SQL miroir exactement ces relations, il semble que vous êtes désireux quelque chose comme:

DataContext.Projects 
    .Where(a => a.ProjectPictures.ProjectPictureType_ID == 1) 
    .Distinct() 
    .Select(a => a.Project_ID) 
    .ToList() 

Je suppose que la structure de votre base de données ressemble à ceci:

Projects      ProjectPictures 
========      =============== 
Project_ID (PK, int)   ProjectPicture_ID (PK, int) 
           Project_ID (FK, int) 
           ProjectPictureType_ID (FK, int) 

ProjectPictureTypes 
=================== 
ProjectPictureType_ID (PK, int) 
0

pour autant que je comprends que vous voulez tous les projets liés à "ProjectPictureTypes" où l'ID est 1.

Autant que je pense que vous pourriez vouloir regarder le groupement et un agrégat approprié - quoi que ce soit. Un regroupement sur p.Projects.Id est alors distinct pour p.Projects.Id. Le moment difficile peut être l'agrégat approprié - si dans le sens de la logique métier il y en a un.

HTH

0

Vous allez avoir à écrire une coutume IEqualityComparer

public class ProjectPicturesComparer: IEqualityComparer<ProjectPictures> 
    { 
     // Products are equal if their names and product numbers are equal. 
     public bool Equals(ProjectPictures p, ProjectPictures p2) 
     { 
      return p.Projects.Id == p2.Projects.Id; 
     } 

     // If Equals() returns true for a pair of objects, 
     // GetHashCode must return the same value for these objects. 

     public int GetHashCode(ProjectPictures p) 
     { 
      // Calculate the hash code for the product. 
      return p.Projects.Id.GetHashCode(); 
     } 

    } 

alors vous feriez

return _dataContext.ProjectPictures.Include("Projects").Include("ProjectPictureTypes").Where(p => p.ProjectPictureTypes.Id == 1)..Distinct(new ProjectPicturesComparer()).ToList()