4

我有 3 张桌子。2 包含我需要执行 UNION 以获取所有唯一文件的文件列表,然后我想对第三个表进行左外连接以查找仅在第三个表中而不在另一个表中的所有文件2.

要执行 UNION,我有以下内容:

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

现在,要仅在第三个表中获取文件,我将执行左外连接:

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

我了解如何简单地针对 ONE 表进行左外连接,但是如何将第一个查询的结果集放入左外连接?基本上,我不想对 ImagesT1 进行左外连接,而是想对 imageUnion 结果进行操作。

谢谢!

4

2 回答 2

4

您需要在您的联盟中选择多个属性;当前结果是 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。

尽管考虑得更多,但 Union 可能不适用于 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 });
于 2009-03-18T16:08:15.340 回答
1

您应该能够再次从第一个查询而不是图像表中进行选择。就像是:

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 查询以选择大小和文件名(以及最终查询中需要的任何其他列)。

于 2009-03-18T15:36:04.357 回答