LINQ to SQL выполняет объединение и левое внешнее соединение - PullRequest
3 голосов
/ 18 марта 2009

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

Для выполнения СОЮЗА у меня есть следующее:

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.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 18 марта 2009

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

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.

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

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 });
1 голос
/ 18 марта 2009

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

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

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

...