2016-12-06 9 views
0

私はDTOクラスとEntity Frameworkを使用してリストに変換されたテーブルを持っています。C#とLINQは2つのリスト内の特定の項目を比較します

私のページが投稿されると、私のdtoのリストが送信されます。私がしたいのは、特定の要素に基づいてdtoリストとEFリストを比較するコードを書くことです。これは私のコードです...

MY DTO

public class DTOAddNewSpecialNeed 
{ 
    public long PersonId { get; set; } 
    public List<AddEditSpecialNeedList> SelectedSpecialNeeds { get; set; } 
    public List<AddEditSpecialNeedList> AvailableSpecialNeeds { get; set; } 
    public Guid LtcConcurrencyCheck { get; set; } 

    public class AddEditSpecialNeedList 
    { 
     public int PersonSpecialNeedId { get; set; } 
     public int SpecialNeedTypeId { get; set; } 
     public string SpecialNeedDescription { get; set; } 
     public DateTime? StopDate { get; set; } 
     public int SortOrder { get; set; } 
    } 
} 

... dtoSelectedListにアクセスするための私のコードは、DTOの私のリストは、私のdbSelectedListが私のEFオブジェクト(表)である...に渡されますされ私はそれに比べている。基本的には、dbに存在するすべてのdtoのリストを保持したい(dbselectelist、specialneedtypeidの一致とspecialneedtypeがisnt other(-12))。私もduplicateを持つことができます。このコードを記述するか、私はちょうど間違った私の比較をやっている以上のロジックがある

var matchedDtos = dtoSelectedList.SelectMany(dto => dbSelectedList 
       .Where(db => db.SpecialNeedTypeID == dto.SpecialNeedTypeId 
          && dto.SpecialNeedTypeId != -12)).ToList(); 
var matchedOtherDtos = dtoSelectedList.SelectMany(dto => dbSelectedList 
        .Where(db => db.SpecialNeedTypeID == dto.SpecialNeedTypeId 
           && dto.SpecialNeedTypeId == (int)SpecialNeedType.Other 
           && db.OtherTypeText == dto.SpecialNeedDescription.Replace("Other: ", "").Trim())).ToList(); 

私のメソッドのシグネチャがSpecialNeedクラスがエンティティによって生成されたクラスです:?。

public List<SpecialNeed> NeedsCompareDtoToDb(List<DTOAddNewSpecialNeed.AddEditSpecialNeedList> dtoSelectedList, List<SpecialNeed> dbSelectedList 
+1

いただきました質問を取得しますか? – Liam

+0

"これは動作しません、なぜですか?"どういう意味ですか?達成しようとしていることを説明できますか? –

+0

== –

答えて

1

書き込みA小さな方法、

例えば

boolean compareDTOAndListItem(DTOAddNewSpecialNeed dto, AddEditSpecialNeedList item) { 
    //comparison logic here 
    if (dto.SpecialNeedTypeID != item.SpecialNeedTypeId) 
     return false; 

    return true; 
} 

その後、あなたは簡単にLINQクエリを含め、どこにでもこの方法を使用することができます。 あなたが

var dto = yourdto; 
var items = yourlistofitems; 
var matchingitems = items.Select(x => compareDTOAndListItem(dto, x)); 

はそれが役に立てば幸いDTOに一致する項目を見つけ、2つのリストを比較するために、余分なメソッドを作成、またはリスト

例を比較するために、高度なLINQクエリ(参加、...)を使用することができます。 。

編集:リストあなたが任意のLINQの比較子を使用することはできません

を比較するためにそれを使うのか?

var listitems = allyourlistitems; 
var dtos => allyourdtos; 

var dtomatches = dtos.Where(d =>listitems.Any(l => compareDTOAndListItem(d, x)); 

var dotnotmatching = dtos.where(d => !dtomatches.Contains(d)); 

テストされていないクエリは、夜遅く入力された...しかし、あなたのアイデア

+0

これは役に立ちますが、私のロジックコードはオペアンプに含まれています。それは 'CompareDtoToDb'と呼ばれる小さな関数の中にあります。これは、私が正しく働く方法を知る必要がある比較ロジックです。 – tshoemake

+0

うまくいけばヘルプを更新しました – tshoemake

+0

私は完全にあなたを得ることはありません。比較ロジックは、アプリケーションおよびビジネスルールに固有のものです。 Imho、比較メソッドは、最初のフィールド比較失敗時にfalseを返すか、最後にtrueを返す必要があります。あなたはその演算子メソッドに基づいてリストをフィルタリングすることができます –

関連する問題