LINQ to SQL做联盟和左外连接

时间:2009-03-18 15:24:13

标签: .net linq-to-sql union left-join

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

要做UNION我有以下内容:

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 个答案:

答案 0 :(得分: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。

虽然对此有更多的考虑,但联盟可能无法使用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 :(得分: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查询以选择大小和文件名(以及您在最终查询中需要的任何其他列)。