'System.Linq.Expressions.ParameterExpression' должен возвращать ненулевое значение того же типа - при вызове EF API. - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь заполнить свойство int класса в. NET Контроллере API Core 3.1 (с использованием Entity Framework Core) с помощью следующего кода:

[HttpGet("Get")]
public async Task<ActionResult<IEnumerable<Partner>>> Get()
{
     List<Device> devices = await _context.Devices.ToListAsync();
     List<Partner> items = await (from p in _context.Partners
               select new Partner
               {
                Id = p.Id,
                Name = p.Name,
                FiscalCode = p.FiscalCode,
                Licenses = p.Licenses,
                Erp = p.Erp,
                ErpName = p.Erp == 1 ? "Erp 1" : "Erp 2",
                Devices = devices.Count(k => k.PartnerId == p.Id)
                }).OrderBy(k => k.Name).ToListAsync();

      return items;
}

The Devices = devices.Count(k => k.PartnerId == p.Id) строка генерирует следующую ошибку: System.InvalidOperationException: When called from 'VisitLambda', rewriting a node of type 'System.Linq.Expressions.ParameterExpression' must return a non-null value of the same type

Что я делаю не так?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Я думаю, вы пытаетесь объединить группу и с помощью в базе данных. Таким образом, вы просто запрашиваете один раз в базе данных, поэтому лучшая производительность .

Попробуйте следующее:

List<Partner> items = await(from p in _context.Partners
                                    join d in _context.Devices
                                        on p.Id equals d.PartnerId
                                    group d by d.Partner /*relation property*/ into g
                                    select new Partner
                                    {
                                        Id = g.Key.Id,
                                        Name= g.Key.Name,
                                        DeviceCount=g.Count()
                                        // select other your properties here
                                    }).OrderBy(k => k.Name).ToListAsync();

Но если вы хотите продолжить то, что вы были делать то, что не рекомендуется, попробуйте поместить таблицу Partner в память, затем выберите данные из них в таблицах памяти. вот так:

var partners=await _context.Partners.ToListAsync();
0 голосов
/ 11 июля 2020

То, что вы пытаетесь сделать, это внутреннее объединение с ними, и лучше позволить EF справиться с этим:

var partners =  from partner in _context.Partners
                join device in _context.Devices on partner.Id equals device.PartnerId into devices
                select new Partner()
                {
                    Id = partner.Id,
                    Name = partner.Name,
                    FiscalCode = partner.FiscalCode,
                    Licenses = partner.Licenses,
                    Erp = partner.Erp,
                    ErpName = partner.Erp == 1 ? "Erp 1" : "Erp 2",
                    Devices = devices
                };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...