0

我在使用 EF 和 linq 将正确的数据加载到 DTO 时遇到问题。

从我的数据库中,我收到以下示例数据:

1, 1, 1

1, 1, 2

1, 1, 3

2, 1, 4

2, 1, 5

等等

我想将这些数据加载到 DTO 中,它应该如下所示:

int, int, ICollection<int>

所以对于示例数据:

new MyDto(1, 1, new List<int> { 1, 2, 3 });
new MyDto(2, 1, new List<int> { 4, 5 });

这是我的 linq 查询

var result = (from adresses in context.Adress
              join person in context.Person on adresses.PersonId equals person.Id
              select new MyObj { Id1 = adresses.Id1, Id2 = adresses.Id2, PersonId = person.Id })

但这是错误的,因为它没有按 Id1 和 Id2 分组,也没有将 personIds 放在列表中......

你能告诉我如何实现这一目标吗?

4

3 回答 3

1

使用 Linq 透视数据是一种更好的方法。你可以看看这个链接:

是否可以使用 LINQ 透视数据

为了回答你的问题,下面是一个例子:

var result = (from adresses in context.Adress
              join person in context.Person on adresses.PersonId equals person.Id
              group address by address.Id1 into gResult
              select new{
                Id1 = gResult.Key,
                Id2 = gResult.Select(r => r.Id2).FirstOrDefault (),
                Id3 = gResult.Select (r => r.Id3)
              });
于 2013-11-04T14:32:13.697 回答
0

在您的 Address 类中,您是否具有 Person 实例的属性,以便您能够在两个类之间建立关系?如果是这样,以下查询可能会为您提供您正在寻找的结果集:

public class Address 
{
   public int Id1 { get; set; }
   public int Id2 { get; set; }
   public virtual Person Person { get; set; }
}

public void Foo() 
{
   IEnumerable<MyObj> = context.Address.Select(x => new {
                                                           Id1 = x.Id1,
                                                           Id2 = x.Id2,
                                                           PersonId = x.Person.Id 
                                                         });
}
于 2013-11-04T14:27:56.457 回答
0

谢谢你们的好答案,我终于可以解决了:-)

var result = from tuple in (from address in context.Adresses
                            join person in context.Persons on address.PersonId equals person.Id
             select new { person.Id, address.Id1, address.Id2})
             group tuple by new { tuple.Id1, tuple.Id2 } into myGrouping
             select 
                 new MyObj 
                     { 
                         Id1 = myGrouping.Key.Id1,
                         Id2 = myGrouping.Key.Id2,
                         PersonIds = myGrouping.Select(x => x.PersonId).Distinct()
                     };
于 2013-11-05T07:22:10.410 回答