LINQ to SQL中做一个联盟和左外部联接
-
20-08-2019 - |
题
我有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查询来选择大小以及文件名(和你在最终的查询需要的任何其他列)
不隶属于 StackOverflow