SELECT     
    dbo.Projects.TaskMaster, dbo.Projects.Location, dbo.Photos.Photo
FROM
    dbo.Photos 
INNER JOIN
    dbo.Projects ON dbo.Photos.ProjectID = dbo.Projects.ProjectID
WHERE
    (dbo.Projects.IsTopProject = 1)

Muszę zaimplementować to polecenie SQL za pomocą Linq Lambda.

0
Aram 1 kwiecień 2020, 01:11

5 odpowiedzi

Najlepsza odpowiedź
var result = dbo.Projects
    // you only want the top projects:
    .Where(project => project.IsTopProject == 1)

    .Join(dbo.Photos              // join the remaining Projects with Photos
    project => project.ProjectId, // from every project take the ProjectId,
    photo => photo.ProjectId,     // from every photo take the ProjectId,
    (project, photo) => new       // when they match make one new object
    {                             // containing the following properties:
         TaskMaster = project.TaskMaster,
         Location = project.Location,
         Photo = project.Photo,
    });

Dość często ludzie są zainteresowani „Najlepszymi projektami ze zdjęciami”, „Szkoły ze swoimi uczniami” lub „Klienci z zamówieniami”. W takich przypadkach GroupJoin może być bardziej interesujące.

Normalne sprzężenie wewnętrzne daje następującą sekwencję:

Project  Photo
   A       3
   A       4
   B       2
   A       6
   C       1
   B       5

GroupJoin spowoduje to:

  • Projekt A ze zdjęciami 3, 4, 6
  • Projekt B ze zdjęciami 2, 5
  • Projekt C ze zdjęciem 1
  • Project D nie ma jeszcze zdjęć.

Poza tym wydaje się to bardziej naturalne, a zaletą jest to, że jeśli masz projekt z 1000 zdjęć, przeniesiesz właściwości projektu tylko raz, zamiast 1000 razy.

Aby to zrobić, rozważ następujące stwierdzenie:

var result = dbo.Projects.Where(project => project.IsTopProject == 1)
    .GroupJoin(dbo.Photos                // GroupJoin the remaining Projects with Photos
    project => project.ProjectId,        // from every project take the ProjectId,
    photo => photo.ProjectId,            // from every photo take the ProjectId,
    (project, photosOfThisProject => new // from every project with all its matching
    {                                    // photos, make one new object
         TaskMaster = project.TaskMaster,
         Location = project.Location,

         Photos = photosOfThisProject.ToList(),

         // or if you only need some Photo properties:
         ProjectId = project.ProjectId,
         Photos = photosOfThisProject.Select( photo => new
         {
              // select the Photo properties that you plan to use
              Id = photo.Id,
              ...

              // not needed: you know the value:
              // ProjectId = photo.ProjectId,
         })
         .ToList()
    });
1
Harald Coppoolse 1 kwiecień 2020, 12:29

Co powiesz na coś takiego:

from photo in dbContext.Photos
join project in dbContext.Projects
on photo.ProjectID equals project.ProjectID
where project.IsTopProject == 1
select new { 
   photo.Photo, 
   project.TaskMaster,
   project.Location
};

Jeśli naprawdę chcesz używać lambd, daj temu szansę:

dbContent.Photos
   .Join(dbContext.Projects.Where(x => x.Project.IsTopProject == 1), 
         photo => photo.ProjectID,
         project => project.ProjectID,
         (photo, project) => new { 
            photo.Photo, 
            project.TaskMaster,
            project.Location 
         });
2
College Code 31 marzec 2020, 23:59
var query = database.Photos   
   .Join(database.Projects, 
      photos => photos.ProjectID,      
      project => project.ProjectID,   
      (photos, project) => new {Photos = photos, Projects = project}) 
   .Where(photosAndproject => photosAndproject.Projects.IsTopProject = 1);  
1
Sina 1 kwiecień 2020, 01:12
            var result = await yourContext.Projects.Where(proj => proj.IsTopProject == true)
                   .Join(yourContext.Photos,
                         proj => proj.ProjectId,
                         photo => photo.ProjectID,
                         (proj,
                          photo) => new resultType
                                    {
                                        proj.TaskMaster,
                                        proj.Location,
                                        photo.Photo
                                    }).ToListAsync(cancellationToken); 
0
chichiton 31 marzec 2020, 22:39

To

SELECT     dbo.Projects.TaskMaster, dbo.Projects.Location, dbo.Photos.Photo
FROM         dbo.Photos INNER JOIN
                      dbo.Projects ON dbo.Photos.ProjectID = dbo.Projects.ProjectID
WHERE     (dbo.Projects.IsTopProject = 1)

Powinno być coś w rodzaju

var q = db.Photos()
          .Where( p => Projects.IsTopProject )
          .Select( p => new 
              {
               p.Project.TaskMaster, 
               p.Project.Location, 
               p.Photo
              });

W EF należy użyć Właściwości nawigacji zamiast Join ().

0
David Browne - Microsoft 31 marzec 2020, 23:20