Соединение Linq для многопоточных столбцов с условием «где не равно» и необходимость возврата столбцов из обеих таблиц

#c# #linq #join

#c# #linq #Присоединиться

Вопрос:

Я объединяю таблицы по двум столбцам и мне нужно найти записи, в которых третий столбец не совпадает.

Запрос linq, который у меня есть, вернет правильные записи из таблицы 1, но я не могу выбрать столбец даты из второй таблицы.

Я пробовал группировать результаты, но возникли проблемы с условием «где не равно».

Итак, у меня есть эти записи:

Таблица 1: 4SONS, 112, 03.09.2016

Таблица 2: 4SONS, 112, 26.09.2016

Что мне нужно вернуть, так это — 4SONS, 112, 03.09.2016, 26.09.2016

Но мой запрос возвращает только — 4SONS, 112, 03.09.2016 без возможности получить эту дату из таблицы 2. Это только 3 столбца в каждой таблице.

 var query = from s in schedTable.AsEnumerable()
            where s.Field<DateTime?>("AuditDate").HasValue

            join c in completeTable.AsEnumerable()
            on new { account = s.Field<string>("Account").ToString(), store = s.Field<string>("Store").ToString()} 
            equals new { account = c.Field<string>("Account").ToString(), store = c.Field<string>("Store").ToString() }

            where s.Field<DateTime>("AuditDate").Date != c.Field<DateTime>("AuditDate").Date
            select s;

var typeD = query.ToList();
 

Комментарии:

1. Результат, по-видимому, не может быть списком записей данных. Создайте класс и используйте select new YourClass { ... } . Или анонимный тип.

Ответ №1:

Это сделает то, что вы ищете:

 var query = from s in schedTable.AsEnumerable()
                    where s.Field<DateTime?>("AuditDate").HasValue
                    join c in completeTable.AsEnumerable()
                    on new { account = s.Field<string>("Account").ToString(), store = s.Field<string>("Store").ToString()}
                      equals new { account = c.Field<string>("Account").ToString(), store = c.Field<string>("Store").ToString()}
                    where s.Field<DateTime>("AuditDate").Date != c.Field<DateTime>("AuditDate")
                    select new {
                        account = s.Field<string>("Account"),
                        store = s.Field<string>("Store"),
                        sched = s.Field<DateTime>("AuditDate"),
                        comp = c.Field<DateTime>("AuditDate")
                    };
        var typeD = query.ToList();