如何使用LINQ to Entities查询连接表?

时间:2016-09-29 11:59:16

标签: c# entity-framework linq

我有一个简单的数据库结构:

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; }
}

我需要创建一个事故列表,我可以传递给WPF表单(使用MVVM)

首先,我想在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. 如果我想从Accident表中获取所有值的列表,包括来自Transport和Person表的数据

  2. 如果我想获得按TransportID分组的事故列表(也包括来自人员和交通表的数据)

  3. 我从Linq查询中获取数据:

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

    但我需要添加一些字段来列出其他表,代码是什么?

    我做错了什么并且无法构造一个AccidentObject列表,也许我的DBContext中有一些错误,列出了什么......你能帮我理解一下List元素吗?

    考虑到我写的两部分:

    var result =来自DBContext.Accidents中的ac选择ac;

    result = result.GroupBy(g =&gt; g.TransportID).toList();

    现在我需要添加一些传输详细信息并格式化AccsidentObject列表......

2 个答案:

答案 0 :(得分: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 
});

以同样的方式填补空白。 这里是一个不使用lambda表达式的linq示例,如果您愿意,它包括group by子句:Linq to sql select into a new class

答案 1 :(得分: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的集合。