2016-09-29 12 views
1

私はシンプルなDB構造を有する:LINQ to Entitiesクエリを使用してテーブルを結合する方法は?

public class Person 
{ 
    [Key] 
    public int PersonID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class Transport 
{ 
    [Key] 
    public int TransportID { get; set; } 
    public string Model { get; set; } 
    public string Brand { get; set; } 
} 

public class Accident 
{ 
    [Key] 
    public int AccsidentID { get; set; } 
    public DateTime AccidentDate { get; set; } 
    public int TransportID { get; set; } 
    [ForeignKey("TransportID")] 
    public virtual Transport Transport { get; set; } 

    public int PersonID { get; set; } 
    [ForeignKey("PersonID")] 
    public virtual Person Person { get; set; } 
} 

私は事故のリストを作成する必要があり、私は(MVVMを使用して)WPFフォームに渡すことができWICH

まず私がしたい、新しいクラスの魔女を作成私GRIDCONTROLで見る

public class AccsidentObject 
{ 
    [Key] 
    public int AccidentID { get; set; } 
    public DateTime AccidentDate { get; set; } 
    public int TransportID { get; set; } 
    public string Model { get; set; } 
    public string Brand { get; set; } 
    public int PersonID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

はあなたが私に与えてもらえ例:

  1. 私は交通からのデータとのPersonテーブル私はTransportIDでグループ化された事故の一覧を取得したい場合

(また、Personと交通のテーブルからデータを含める)を含む事故テーブルからすべての値の一覧を取得したい場合

var result = from ac in DBContext.Accidents select ac; 
List<Accident> accidentList = result.toList(); 

しかし、私はどのようなコードは次のようになり、他のテーブルから一覧表示するにはいくつかのフィールドを追加する必要があります。

私は、LINQクエリからデータを取得していますか?

私は間違ったことをしてAccidentObjectのリストを構築できませんでした。多分私のDBContextに何か間違いがあります。何かをリストしています... List要素を理解するのを助けてください?私が書いた2パートに考慮

VAR結果= DBContext.Accidentsで交流から選択し、交流。

result = result.GroupBy(g => g.TransportID).toList();

そして今、私はいくつかのトランスポートの詳細およびフォーマットAccsidentObjectリストを追加する必要があります...

+0

最初の部分は単純です: 'select ac'の代わりに'新しいAccsidentObject {AccidentID = ac.AccidentID、etc ...} 'を使用してください(' AccsidentObject'のすべてのプロパティを対応する 'ac'、' ac .Transport'と 'ac.Person'フィールド) –

+0

ありがとう、モミの部分が解決されました...私は本当に選択した新しいAccidentObject {} – Songaila

答えて

1

団体熱心に取り込ま使用してInclude拡張メソッドをエンティティ(またはエンティティのコレクション)を取得、またはに含めますあなたのタイプへの最終投影:

var res = await (from a in ctx.Accidents 
       select new AccsidentObject { 
        AccidentID = a.AccidentID, 
        TransportID = a.Transport.TransportID, 
        Model = a.Transport.Model, 
        // … 
       }).ToListAsync(); 

あなたが何かによってグループにLINQの理解式でgroupbyを使用することができます。その結果、Keyプロパティはグループ化されたものであり、各インスタンスはグループ化されたすべてのもののコレクションです。結果として匿名型で

var res = await (from a in ctx.Accidents 
       group by a.TransportID into g 
       select new { 
        TransportID = g.Key, 
        Accidents = g 
       }).ToListAsync(); 

AccidentsプロパティがAccidentのコレクションであると。

+0

を見逃しました。そして、これらの事故をどのように表示するのですか?実際にはこの事故リストのみが必要ですが、WPFフォームに渡す方法がわかりません – Songaila

+0

@Songaila内部コレクション、データベース、またはその他のリソースからデータを取得することは、APFチュートリアルの一部である必要があります。それは本当に[SO]答えの範囲を超えています。 – Richard

1
var accidents = DBContext.Accidents.Select(a => new AccidentObject 
{ 
    AccidentID = a.AccidentId, 
    AccidentDate 
    TransportID 
    Model 
    Brand = a.Transport.Brand, 
    PersonID = a.Person.PersonID, 
    FirstName 
    LastName 
}); 

とほとんど同じように空白を埋めます。ここ は、あなたがそれを好む場合はgroup by句が含まれていることを、ラムダ式を使用せずにLINQの例です:Linq to sql select into a new class

関連する問題