Преобразовать команду SQL в функцию Linq Lambda? - PullRequest
0 голосов
/ 01 апреля 2020
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)

Мне нужно реализовать эту команду SQL, используя Linq Lambda.

Ответы [ 5 ]

2 голосов
/ 01 апреля 2020

Примерно так:

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

Если вы действительно хотите использовать лямбды, сделайте это:

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 
         });
1 голос
/ 01 апреля 2020
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,
    });

Довольно часто люди интересуются «Лучшие проекты с их фотографиями», или «Школы со своими учениками» или «Клиенты со своими заказами». В таких случаях GroupJoin может быть более интересным.

Обычное внутреннее объединение даст вам следующую последовательность:

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

GroupJoin приведет к этому:

  • Проект A с фотографиями 3, 4, 6
  • Проект B с фотографиями 2, 5
  • Проект C с фото 1
  • В проекте D еще нет фотографий.

Помимо того, что это кажется более естественным, преимущество заключается в том, что если у вас есть проект с 1000 фотографий, вы будете передавать свойства проекта только один раз, а не 1000 раз.

Для этого рассмотрим следующее утверждение:

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 голос
/ 01 апреля 2020
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);  
0 голосов
/ 01 апреля 2020

Это

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)

должно выглядеть примерно так:

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

В EF вы должны использовать Свойства навигации вместо Join ().

0 голосов
/ 01 апреля 2020
            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); 
...