2017-03-09 5 views
0

私は現在、EF 6のASP.NET MVC 4.5アプリケーションで作業しています。現在、Entity Frameworkを使用してDBにデータを格納するlinqクエリを処理しています。新しいリストを作成<T> 2のうちリスト<VM>

私の問題:クエリSwotPartsに、私は2つのList<VM>で構成されて1 List<T>を作成する必要があります。したがって、同じタイプの2つのリストを新しいタイプにマージします。

私のクエリは次のようになります。

SWOT = vm.Swots.Select(x => new SWOT 
{ 
    SwotForId = x.SwotForId, 
    SwotParts = x.ExternalSwotParts.Select(y => new SwotPart 
    { 
     SwotTypeId = y.SwotTypeId, 
     Label = y.Label 
    }, 
    x.InternalSwotParts.Select(z => new SwotPart 
    { 
     SwotTypeId = z.SwotTypeId, 
     Label = z.Label 
    })).ToList()  
}).ToList() 

明らかにこれは動作しませんが、私はそれが基本的な考え方を示して願っています...ここで

は私のクラスSWOTです:

public partial class SWOT 
{ 
    public SWOT() 
    { 
     this.SwotPart = new HashSet<SwotPart>(); 
    } 

    public int SwotId { get; set; } 
    public SwotFor SwotForId { get; set; } 

    public virtual ICollection<SwotPart> SwotPart { get; set; } 
} 

およびswotvm

public class SwotVm 
{ 
    // enum 
    public SwotFor SwotForId { get; set; } 
    public List<SwotPartVm> InternalSwotParts { get; set; } 
    public List<SwotPartVm> ExternalSwotParts { get; set; } 
} 

と私のクラスSwotPart

public partial class SwotPart 
{ 
    public byte SwotPartId { get; set; } 
    public SwotType SwotTypeId { get; set; } 
    public string Label { get; set; } 
} 

ありがとうございました!注目すべき

+0

は、クラスを表示 'SWOT'と' SwotPart' –

+2

どのように誰もがあなたがその質問からの話を知っていることを期待することができますか?あなたは2つのリストを1つに連結し、それをオブジェクトに割り当てるために何をしようとしていますか? –

答えて

-1

あなたが必要とするのは、2つのシーケンスを1つにまとめたConcat()メソッドです。

は、例えば:

SWOT = vm.Swots.Select(x => new SWOT 
{ 
    SwotForId = x.SwotForId, 
    SwotParts = x.ExternalSwotParts.Select(y => new SwotPart 
    { 
     SwotTypeId = y.SwotTypeId, 
     Label = y.Label 
    }).Concat(
    x.InternalSwotParts.Select(z => new SwotPart 
    { 
     SwotTypeId = z.SwotTypeId, 
     Label = z.Label 
    })).ToList()  
}).ToList() 
+0

こんにちはBrandon、Concatは魅力として働いています。私は基本的にこのクエリを使用し、where句でヌルチェッカーを追加しました: '.Where(q => q.Label!= null)'ありがとう! – TimHorton

+0

@TimHorton 'Union'は、重複を削除する点を除いて、' Concat'に似ています。とにかく、助けになるのはうれしい! –

0
SWOT = vm.Swots 
    .Include(x => x.ExternalSwotParts) 
    .Include(x => x.InternalSwotParts) 
    .Where(...) 
    .ToArray() 
    .Select(x => new SWOT 
{ 
    SwotForId = x.SwotForId, 
    SwotParts = x.ExternalSwotParts.Select(y => new SwotPart 
    { 
     SwotTypeId = y.SwotTypeId, 
     Label = y.Label 
    }).ToList(), 
    InternalSwotParts = x.InternalSwotParts.Select(z => new SwotPart 
    { 
     SwotTypeId = z.SwotTypeId, 
     Label = z.Label 
    }).ToList() 
}).ToList() 

まず最初に、あなたが内側のSELECT文はEF遅延ロードを経由して、追加のクエリを起こさないように、あなたの元のクエリでExternalSwotPartsとInternalSwotPartsを含めるEFを伝える必要があります。

次に、selectの前にToArrayを呼び出します。これにより、EFはすぐにSQLクエリを実行し、すべてのSwotsおよびSwotPartをメモリにロードします。次に、すべてのデータが現在メモリに格納されているので、内部で通常の選択を行うことができます。

+0

これは現在間違っていますInternalSwotParts –

+1

@ johnny5:実際に有効なC#のコードを書いたかったので、追加しました。質問の投稿コードがかっこと括弧の不一致で埋められていました。 – caesay

+1

ええ、私は質問が彼が作成したいオブジェクトにあった投稿していない最初から不明だったことを知っている、彼はそれらのリストをマージしたいと思われるようです –

0

MVVMオブジェクトにVMを定義する必要があります。

public class CreateModelHouseViewModel 
{ 
    public CreateModelHouseViewModel() 
    { 
    } 
    public CreateHouseViewModel House { get; set; } 
    public CreateAddressViewModel Billing { get; set; }  
} 

//サンプル

var vm = new CreateModelHouseViewModel(); 

var pocoEntity = new PocoEfModel {propA=vm.House.propA}; 

//私はこれが役に立てば幸いエンティティ

var pocoEntityList = new List<PocoEfModel>(); 
pocoEntityList.Add(New PocoEfModel {propA=vm.House.propA}; 

のリスト!

+0

これはちょうど間違っています、それはopの質問 –

+0

に答えることはできませんが、それは答えとして受け入れられたので、何とかOPの質問に答える必要があります。私はどのように表示されませんが。 –

+0

私は最後に、私のViewModelにSwotPartsという新しいプロパティを追加しました.Serviceクラスでは、AddRangeを使ってInternalSwotPartsとExternalSwotPartsをSwotPartsにマージします。ありがとう! – TimHorton

1

この状況で役立つ組み込みのメソッド.ConvertAll()があります。

//merge the two existing lists 
oldList1.AddRange(oldList2); 

//make a new one converted into the new type 
var newList = oldList1.ConvertAll(
    (originalElement) => new Blah(originalElement.Property) 
); 
+0

ここですべてのヘルプをどのように変換しますか? –

+0

彼は "リストを作成する必要があるので、2つのリストで構成されています。" ConvertAll()は "VM"から "T"への変換を新しいものにします。 – Colin

+0

AddRangeは良いものです!次回ConvertAllを使用します;)ありがとう – TimHorton

関連する問題