我有3个表。 2包含的文件列表,我需要做一个UNION上让所有的独特的文件,然后我希望做一个左外连接反对第三表,找出所有的,而不是在第3个表中的其他文件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 };  

我知道如何做左外连接简单地对一个表,但我怎么得到的结果集我第一次查询到左外连接?基本上,而不是做左外连接对ImagesT1我想这样做对imageUnion结果。

谢谢!

有帮助吗?

解决方案

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

其他提示

您应该能够从你的第一个查询图像表,而不是再次选择。是这样的:

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