我有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结果进行。
谢谢!
答案 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查询以选择大小和文件名(以及您在最终查询中需要的任何其他列)。