質問

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クエリを編集して、サイズとファイル名(および最終クエリで必要な他の列)を選択する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top