LINQ to SQL выполняет объединение и Левое внешнее соединение

StackOverflow https://stackoverflow.com/questions/658748

Вопрос

У меня есть 3 стола.2 содержат списки файлов, для которых мне нужно выполнить объединение, чтобы получить все уникальные файлы, затем я хочу выполнить левое внешнее объединение с 3-й таблицей, чтобы найти все файлы, которые находятся только в 3-й таблице, а не в двух других.

Чтобы сделать ОБЪЕДИНЕНИЕ, у меня есть следующее:

var imageUnion = (from img in dc.ImageT1
                  select img.filename).Union(
                  from img in dc.ImageT2
                  select img.filename);

Теперь, чтобы получить файлы только в 3-й таблице, я бы выполнил левое внешнее соединение как таковое:

var query = from image in dc.ImageT1
            join active in dc.ActiveImages on image.filename equals 
            active.filename into gj
            from subimage in gj.DefaultIfEmpty()
            where subimage.filename == null
            select new { image.filename, image.size };  

Я понимаю, как выполнить левое внешнее соединение просто для ОДНОЙ таблицы, но как мне получить результирующий набор моего первого запроса в левое внешнее соединение?По сути, вместо того, чтобы выполнять левое внешнее объединение с ImagesT1, я хочу сделать это с результатом imageUnion .

Спасибо!

Это было полезно?

Решение

Вам необходимо выбрать более одного объекта недвижимости в вашем Союзе;Текущий результат - IEnumerable<string> (предполагается, что ваше имя файла является строкой).

var imageUnion = (from img in dc.ImageT1
                  select new { Filename = img.filename, Size = img.size }).Union(
                  from img in dc.ImageT2
                  select new { Filename = img.filename, Size = img.size });

Затем вы должны быть в состоянии использовать его во втором запросе для замены dc.ImageT1.

Хотя, подумав об этом подробнее, Объединение может не работать с двумя анонимными типами;Чтобы поддержать это, может быть, стоило бы определить класс, который имеет только имя файла и размер?

public class TempImage
{
    public string Filename { get; set; }
    public int Size { get; set; }
}

var imageUnion = (from img in dc.ImageT1
                  select new TempImage() { Filename = img.filename, Size = img.size }).Union(
                  from img in dc.ImageT2
                  select new TempImage() { Filename = img.filename, Size = img.size });

Другие советы

Вы должны снова иметь возможность выбирать из своего первого запроса вместо таблицы изображений.Что - то вроде:

var query = from image in imageUnion
            join active in dc.ActiveImages on image.filename equals 
            active.filename into gj
            from subimage in gj.DefaultIfEmpty()
            where subimage.filename == null
            select new { image.filename, image.size };

Редактировать:Вам также придется отредактировать свой запрос imageUnion, чтобы выбрать размер, а также имя файла (и любые другие столбцы, которые вам понадобятся в вашем окончательном запросе).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top