Linq: выбрать из нескольких таблиц в одну предварительно определенную сущность - PullRequest
3 голосов
/ 15 июня 2011

У меня есть две таблицы A и B. Объект домена получает большую часть своих данных из A и некоторую агрегацию из B.

Например:

Table A ( id, name );
Table B ( id_A, quantity );

class A {
     public int id { set; get; }
     public string name { set; get; }
}
class B {
     public int id_A { set; get; }
     public int quantity { set; get; }
}

var result = 
from a in A join b in B on a.id equals b.id_A
group b by b.id_A into g
select new {
     Name = a.name,
     Total = g.Sum( b => b.quantity )
};

Вместо создания анонимного типа я хотел бы добавить свойство к объекту домена A с именем TotalQuantity и заполнить его g.Sum (b => b.quantity). Я также хотел бы превратить результат в IEnumerable вместо var.

Моя первая ставка была

class A {
     public int id { set; get; }
     public string name { set; get; }
     public int TotalQuantity { set; get; }
}

IEnumerable<A> result = 
from a in A join b in B on a.id equals b.id_A
group b by b.id_A into g
select new A {
     name = a.name,
     TotalQuantity = g.Sum( b => b.quantity )
};

Эта операция не поддерживается средой выполнения:

System.NotSupportedException: Explicit construction of entity type 'Data.A' in query is not allowed.

Обратите внимание, что домены A и B не содержат ссылок друг на друга. Их отношения явно не используются в приложении, поэтому я решил не моделировать его.

Как я могу аккуратно заполнить список A, не просматривая данные, хранящиеся в экземплярах анонимного класса?

Ответы [ 2 ]

3 голосов
/ 15 июня 2011

Это должно сделать это (обратите внимание, я не проверял это, поэтому некоторые настройки могут быть в порядке):

IEnumerable <A> result = 
(from a in A join b in B on a.id equals b.id_A
group b by b.id_A into g
select new {
     Name = a.name,
     Total = g.Sum( b => b.quantity )
}).Select(obj => new A {Name = obj.Name, TotalQuantity = obj.Total});
2 голосов
/ 15 июня 2011

Вы будете выполнять проекцию в памяти вместо базы данных .Таким образом, поставщик LINQ to SQL не будет пытаться преобразовать его в запрос SQL.

Вот пример:

IEnumerable<A> result = (from a in A join b in B on a.id equals b.id_A
                         group b by b.id_A into g
                         select new
                         {
                             Name = a.name,
                             Total = g.Sum(b => b.quantity)
                         })
                        .ToArray()
                        .Select(item => new A
                        {
                            Name = item.Name,
                            TotalQuantity = item.Total
                        });

Вызов IQueryable .Метод ToArray () заставит поставщика LINQ to SQL выполнить запрос к базе данных и вернуть результаты в массиве.Затем выполняется окончательная проекция в памяти, чтобы обойти ограничения поставщика LINQ to SQL.

Связанные ресурсы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...