Как правильно создать объединение из двух таблиц, выбирая только определенные столбцы, в которых один столбец будет пустым с некоторым текстом - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь перевести код SQL, который я написал с объединением, в код linq на C #, но я не понимаю, что я делаю неправильно.

У меня есть две таблицы, одна из которых tTask идругой - tTask_Users.

Я попытался объединить их, используя модель, потому что я думал, что это дает мне ошибки, потому что у данных не было одинакового количества столбцов.

Вот мой код SQL:

SELECT PK_Task, TaskName, Enabled, FK_TaskTeam, 'No Owner' AS Owners
FROM tTask
WHERE hasOwner = 0 
  UNION
SELECT PK_Task, TaskName, Enabled, FK_TaskTeam, Login
FROM tTask
INNER JOIN tTask_User ON tTask.PK_Task = tTask_User.FK_Task
INNER JOIN tOfficeUsers on tTask_User.FK_OfficeUser = tOfficeUsers.PK_OfficeUser
WHERE FK_Taskrecipienttype = 5 AND Enabled = 1

Вот что я пытался

private OfficeEntities db = new OfficeEntities();

//GET: api/MainGrid
public IQueryable<MainGridDto> GetGridModelDtos()
{
    var query2 = db.tTask_User.Where(task =>
        task.tTaskRecipientType.pk_taskrecipienttype == 5
    ); 
    var query = from items in query2                            
                select new MainGridDto()
                {
                    PK_Task = items.FK_Task,
                    TaskName = items.tTask.TaskName,
                    TaskRecipientType = items.tTaskRecipientType,
                    Owner = items.tOfficeUser.Login,
                    TaskDescription = items.tTask.TaskDescription,
                    Enabled = items.tTask.Enabled,
                    tTaskTeam = items.tTask.tTaskTeam,
                    EmailBody = items.tTask.EmailBody,
                    EmailSubject = items.tTask.EmailSubject
                };

    var taskquery = db.tTasks.Where(items =>
        items.hasOwner == 0
    );
    var querytask = from items in taskquery
                    select new MainGridDto()
                    {
                        PK_Task = items.PK_Task,
                        TaskName = items.TaskName,
                        TaskRecipientType = null,
                        Owner = "no owner",
                        TaskDescription = items.TaskDescription,
                        Enabled = items.Enabled,
                        tTaskTeam = items.tTaskTeam,
                        EmailBody = items.EmailBody,
                        EmailSubject = items.EmailSubject
                    };

    query2.Union(querytask);
    query.Union(taskquery);
}

Вот ошибки, которые я получаю:

Severity    Code    Description Project File    Line    Suppression State
Error   CS1929  'IQueryable<tTask_User>' does not contain a definition for 'Union' and the best extension method overload 'ParallelEnumerable.Union<MainGridDto>(ParallelQuery<MainGridDto>, IEnumerable<MainGridDto>)' requires a receiver of type 'ParallelQuery<MainGridDto>'    ReportingWebAPI \source\repos\ReportingWebAPI\ReportingWebAPI\Controllers\MainGridController.cs 56  Active

Severity    Code    Description Project File    Line    Suppression State
Error   CS1929  'IQueryable<MainGridDto>' does not contain a definition for 'Union' and the best extension method overload 'ParallelEnumerable.Union<tTask>(ParallelQuery<tTask>, IEnumerable<tTask>)' requires a receiver of type 'ParallelQuery<tTask>'   ReportingWebAPI \repos\ReportingWebAPI\ReportingWebAPI\Controllers\MainGridController.cs    57  Active

Ответы [ 3 ]

1 голос
/ 01 мая 2019

Достаточно одного запроса. Обратите внимание на изменение в свойствах Where и Owner.

var query2 = db.tTask_User.Where(task => task.hasOwner == 0 || (task.Enabled && task.tTaskRecipientType.pk_taskrecipienttype == 5)); 

var query = from items in query2                            
            select new MainGridDto()
            {
                 PK_Task = items.FK_Task,
                 TaskName = items.tTask.TaskName,
                 TaskRecipientType = items.tTaskRecipientType,
                 Owner = items.hasOwner == 0 ? "no owner" : items.tOfficeUser.Login,
                 TaskDescription = items.tTask.TaskDescription,
                 Enabled = items.tTask.Enabled,
                 tTaskTeam = items.tTask.tTaskTeam,
                 EmailBody = items.tTask.EmailBody,
                 EmailSubject = items.tTask.EmailSubject
            };
0 голосов
/ 02 мая 2019

Следуя моему рецепту SQL для LINQ , сначала вы выполняете два подзапроса из SQL:

var query1 = from items in db.tTasks
             where items.hasOwner == 0
             select new MainGridDto() {
                 PK_Task = items.PK_Task,
                 TaskName = items.TaskName,
                 TaskRecipientType = null,
                 Owner = "no owner",
                 TaskDescription = items.TaskDescription,
                 Enabled = items.Enabled,
                 tTaskTeam = items.tTaskTeam,
                 EmailBody = items.EmailBody,
                 EmailSubject = items.EmailSubject
             };
var query2 = from items in db.tTask_User
             where items.tTaskRecipientType.pk_taskrecipienttype == 5 && items.tTask.Enabled
             select new MainGridDto() {
                 PK_Task = items.FK_Task,
                 TaskName = items.tTask.TaskName,
                 TaskRecipientType = items.tTaskRecipientType,
                 Owner = items.tOfficeUser.Login,
                 TaskDescription = items.tTask.TaskDescription,
                 Enabled = items.tTask.Enabled,
                 tTaskTeam = items.tTask.tTaskTeam,
                 EmailBody = items.tTask.EmailBody,
                 EmailSubject = items.tTask.EmailSubject
             };

Затем вы объединяете подзапросы для окончательного ответа:

var ans = query1.Union(query2);
0 голосов
/ 01 мая 2019

Я могу ошибаться, но это похоже на проблему с типами.Общее правило:

  1. оба типа должны иметь точно одно и то же свойство имена
  2. оба типа должны иметь точно то же свойство типы (int против smallint или double против decimal приведет к ошибке сборки)

Похоже query2это тип IQueryable<tTask_User> и querytask это тип IQueryable<MainGridDto>, поэтому вы не можете объединить здесь:

query2.Union(querytask);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...