結合と左外部結合を行うLINQ to SQL
-
20-08-2019 - |
質問
3つのテーブルがあります。 2には、すべての一意のファイルを取得するためにUNIONを実行する必要があるファイルのリストが含まれています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 };
1つのテーブルに対して単純に左外部結合を行う方法を理解していますが、最初のクエリの結果セットを左外部結合に取得するにはどうすればよいですか?基本的に、ImagesT1に対して左外部結合を行う代わりに、imageUnionの結果に対して行います。
ありがとう!
解決
ユニオンで複数のプロパティを選択する必要があります。現在の結果はIEnumerable <!> lt; string <!> gt;です。 (ファイル名が文字列であると仮定)。
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 });
その後、2番目のクエリで使用してdc.ImageT1を置き換えることができるはずです。
これについてはさらに考えますが、EUは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