LINQ to SQL 执行联合和左外连接

Posted

技术标签:

【中文标题】LINQ to SQL 执行联合和左外连接【英文标题】:LINQ to SQL doing a Union and Left Outer Join 【发布时间】:2010-10-14 02:40:23 【问题描述】:

我有 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 结果进行。

谢谢!

【问题讨论】:

【参考方案1】:

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

虽然考虑得更多,但 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 );

【讨论】:

【参考方案2】:

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

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

【讨论】:

那是我最初尝试过的,但我认为因为 imageUnion 结果集是匿名类型,所以它不起作用。我的意思是当你在这个例子中尝试做 image.filename 时,它​​没有 filename 属性。 我假设您不想在第一个查询中选择整个 img,因为结果集太大(如图像中的 blob 或类似的东西) ? 正如 Chris 指出的那样,如果您不想使用 Image 类,您可以创建一个仅包含 Filename 和 Size 的缩小类,一切都应该按照您的意愿工作。

以上是关于LINQ to SQL 执行联合和左外连接的主要内容,如果未能解决你的问题,请参考以下文章

左外连接和多重计数 SQL to LINQ

LINQ to SQL 左外连接

Linq to SQL 左外连接不是

Linq To Sql 左外连接 - 过滤空结果

使用 Linq to Sql 的左外连接结果问题

LINQ to Sql 左外连接与 Group By 和 Have 子句