Возвращение данных нескольких списков внутри объекта в ASP do tnet Core API - PullRequest
0 голосов
/ 08 марта 2020

У меня есть эта модель сущности консигнации.

public Guid Id { get; set; }
public DateTime? DateCreated { get; set; }
public DateTime? DateModified { get; set; }
public bool? Deleted { get; set; }
public string Status { get; set; }
public string Services { get; set; }
public string CustomerReference { get; set; }
public string ConsignmentNote { get; set; }
public int? TotalPieces { get; set; }
...
public virtual ICollection<ConsignmentDocument> ConsignmentDocument { get; set; }
public virtual ICollection<ConsignmentLine> ConsignmentLine { get; set; }
public virtual ICollection<Legging> Legging { get; set; }

Теперь проблема, с которой я сталкиваюсь при получении консигнации, заключается в том, что я не получаю никаких данных ConsignmentLine, Legging, ConsignmentDocument в теле ответа. Сначала я тестировал его только с помощью ConsignmentLine в контроллере консигнации. Это мой метод контроллера GetConsignment ().

// GET: api/Consignments
    [HttpGet("{id}")]
    public async Task<ActionResult<Consignment>> GetConsignment(Guid id)
    {
        var consignment = await _context.Consignment.where(c =>c.Id == id)
            .Include(conline => conline.ConsignmentLine)
            .FirstOrDefault();
        return consignment;
    }

Мой ConsignmentLine.cs такой:

    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public decimal? Length { get; set; }
    public decimal? Width { get; set; }
    public decimal? Height { get; set; }
    public decimal? Volume { get; set; }
    public int? Pieces { get; set; }
    public decimal? Weigth { get; set; }
    public bool? DangerousGoods { get; set; }
    public string DgClass { get; set; }
    public string UnNumber { get; set; }
    public Guid? ConsignmentId { get; set; }
    public Guid? ItemId { get; set; }
    public Guid? CommodityId { get; set; }
    public bool? Deleted { get; set; }

Мой Legging.cs такой:

    public Guid Id { get; set; }
    public DateTime? DateCreated { get; set; }
    public DateTime? DateModified { get; set; }
    public decimal? Cost { get; set; }
    public string LegType { get; set; }
    public string FromLeg { get; set; }
    public string ToLeg { get; set; }
    public Guid? CarrierAccount { get; set; }
    public Guid? ConsignmentId { get; set; }
    public bool? Deleted { get; set; }

Я проверяю его у почтальона, и он возвращает Json Exception. Каким должно быть выражение тогда?

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

Проблема с лямбда-выражением. На данный момент вы не можете фильтровать оператор включения. Если вы хотите отфильтрованный результат, вам придется извлечь их все в память и отфильтровать. В вашем случае вам даже не нужно фильтровать включаемую часть. Только включение свойства навигации будет работать нормально. Предполагая, что этот параметр используется для фильтрации таблицы накладных.

    // GET: api/Consignments
    [HttpGet("{id}")]
    public async Task<ActionResult<Consignment>> GetConsignment(Guid id)
    {
        var consignment = await _context.Consignment.Where(x=>x.Id == id)
                .Include(conline => conline.ConsignmentLine)
                .FirstOrDefault();
        return consignment;
    }

Приведенный выше код просто выдаст вам записи из таблицы Consignmet и ее ConsignmentLine. Попробуйте и дайте мне знать, если это работает.

Однако, это может привести к JSON.NET Error Self-referencing loop detected for type error. Если вы получаете эту ошибку, то вы можете устранить ее, используя следующий метод.

Если вы используете As pNet Core , добавьте следующее к методу ConfigureServices().

services.AddMvc()
    .AddJsonOptions(
        options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
    );

Happy Coding. <3 </p>

0 голосов
/ 09 марта 2020

Как сказано в комментарии, вы не можете использовать фильтрацию в Включить.

И метод GetConsignment возвращает тип накладной, а не набор списков, поэтому вам нужно преобразовать переменную накладной через FirstOrDefaultAsync или SingleOrDefaultAsync.

Попробуйте изменить код на следующее:

public async Task<ActionResult<Consignment>>  GetConsignment(Guid id)       
{ 
        var consignment = await _context.Consignment.Where(x=>x.Id == id)
        .Include(conline => conline.ConsignmentLine)
        .FirstOrDefaultAsync();

        return consignment; 
}

А вот мой ConsignmentLine.cs:

 public class ConsignmentLine
{
    public int Id { get; set; }
}

Чтобы загрузить связанные данные в linq, вы можете обратиться к this .

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