Как выбрать свойства объекта на основе условия?

#c# #entity-framework #asp.net-core

#c# #entity-framework #asp.net-core

Вопрос:

У меня есть это select :

  var CP = db.ContasPagar.Include(c => c.ContasPagarP).Where(c => c.Quitado == true amp;amp; c.Caixa == false amp;amp; c.BancoId == id).Select(c => new BancoList
        {
            Id = c.Id,
            Data = c.DataPagamento,
            Valor = c.Total,
            Tipo = "D",
            Documento = "Fat. Contas Diversas "   c.ContasPagarP.Codigo,

        }).ToList();
        var FP = db.FaturaContasPagar.Include(c => c.FaturaContasPagarP).Where(c => c.Quitado == true amp;amp; c.Caixa == false amp;amp; c.BancoId == id).Select(c => new BancoList
        {
            Id = c.Id,
            Data = c.DataPagamento,
            Valor = c.Total,
            Tipo = "D",
            Documento = "Fat. Nota Fiscal: "   c.FaturaContasPagarP.NotaFiscal,
        }).ToList();
        var CR = db.ContasReceber.Include(c => c.ContasReceberP).Where(c => c.Quitado == true amp;amp; c.Caixa == false amp;amp; c.BancoId == id).Select(c => new BancoList
        {
            Id = c.Id,
            Data = c.DataPagamento,
            Valor = c.Total,
            Tipo = "C",
            Documento = "Fat. Contas Diversas "   c.ContasReceberP.Codigo,
        }).ToList();
        var FR = db.FaturaContasReceber.Include(c => c.FaturaContasReceberP).Where(c => c.Quitado == true amp;amp; c.Caixa == false amp;amp; c.BancoId == id).Select(c => new BancoList
        {
            Id = c.Id,
            Data = c.DataPagamento,
            Valor = c.Total,
            Tipo = "C",
            Documento = c.FaturaContasReceberP.NotaFiscal != null ? "Fat. NFSe: "   c.FaturaContasReceberP.NotaFiscal : null   c.FaturaContasReceberP.NotaFiscalProdutos != null ? " NFe: "   c.FaturaContasReceberP.NotaFiscalProdutos : null,
        }).ToList();
        var BC = db.BancoMovimento.Where(c => c.Credito == true amp;amp; c.ContaId == id).Select(c => new BancoList
        {
            Id = c.Id,
            Data = c.DataMovimento,
            Valor = c.Valor,
            Tipo = "C",
            Documento = c.Historico
        }).ToList();
        var BD = db.BancoMovimento.Where(c => c.Credito == false amp;amp; c.ContaId == id).Select(c => new BancoList
        {
            Id = c.Id,
            Data = c.DataMovimento,
            Valor = c.Valor,
            Tipo = "D",
            Documento = c.Historico
        }).ToList();

        var union = CP.Union(FP).Union(FR).Union(CR).Union(BC).Union(BD).OrderBy(c => c.Data).ToList();
  

Возникает только проблема, не всегда Nfse заполняется, и не всегда NotaFiscalProdutos заполняется, мне это нужно, чтобы проверить наличие этих значений, чтобы добавить в Documento .

Если только NumeroNfse поле имеет значение, оно выглядело бы так: Fat. NFSe: " c.FaturaContasReceberP.NFSe.NumeroNfse и если только NotaFiscalProdutos retorar " NFe: " c.FaturaContasReceberP.NotaFiscalProdutos , и если оба имеют, возвращают два.

Редактировать

 Documento = (c.FaturaContasReceberP.NotaFiscal != null ? "Fat. NFSe: "   c.FaturaContasReceberP.NotaFiscal : null   c.FaturaContasReceberP.NotaFiscalProdutos != null ? " NFe: "   c.FaturaContasReceberP.NotaFiscalProdutos : null).Trim()
  

Я перешел на эту форму, но также работает не так, как ожидалось.

Комментарии:

1. Поделитесь с нами своим текущим кодом для FR и существующими записями в базе данных, текущим результатом для FR .

Ответ №1:

Это было бы длинным утверждением, если бы вы поместили его в Select и значительно повлияло бы на читаемость вашего кода. Вот один из способов обойти это…

В вашем объекте, который принадлежит FaturaContasReceber , создайте свойство, доступное только для чтения, которое выглядит следующим образом:

 public string Documento
{
    get
    {
        string nfse = FaturaContasReceberP?.NFSe?.NumeroNfse;
        string nfe = FaturaContasReceberP?.NotaFiscalProdutos;
        string documento = (nfse ? $"Fat. NFSe: {nfse}" : "")  
                           (nfe ? $" NFe: {nfe}" : "");
        return documento.Trim();
    }
}
  

Тогда вы можете легко использовать его следующим образом:

 var FR = db.FaturaContasReceber
                .Include(c => c.FaturaContasReceberP)
                .Where(c => c.Quitado amp;amp; !c.Caixa amp;amp; c.BancoId == id)
                .ToList()
                .Select(c => new BancoList
                {
                    Id = c.Id,
                    Data = c.DataPagamento,
                    Valor = c.Total,
                    Tipo = "C",
                    Documento = c.Documento
                }).ToList();
  

Редактировать:

Если вы настаиваете на выполнении этого в Select , вы можете сделать это следующим образом:

 Documento = (c.FaturaContasReceberP?.NFSe?.NumeroNfse ? "Fat. NFSe: "   c.FaturaContasReceberP.NFSe.NumeroNfse : ""  
             c.FaturaContasReceberP?.NotaFiscalProdutos ? " NFe: "   c.FaturaContasReceberP.NotaFiscalProdutos : "").Trim()
  

Но я бы посоветовал вам использовать первое решение.

Комментарии:

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

2. @marianac_costa Я не уверен, что понимаю; не могли бы вы, пожалуйста, пояснить? Но сначала попробуйте обновленный код; Я исправил некоторые опечатки.

3. По-прежнему работает не так, как ожидалось. Я не могу изменить свойство, потому что я заполняю его другой таблицей и их объединением.

4. Обработка должна быть прямо здесь Documento = c.Documento

5. @marianac_costa Вам не нужно изменять какие-либо существующие свойства; вы просто добавите новое свойство, доступное только для чтения, как я показал выше. Я решил назвать это Documento но вы можете назвать это как угодно. Затем вы можете использовать Document = c.YourPropertyName . Что именно у вас не работает?

Ответ №2:

Вы можете использовать ?:оператор

     Tipo = "C",
Documento = c.FaturaContasReceberP.NFSe != null ? "Fat. NFSe: "   c.FaturaContasReceberP.NFSe.NumeroNfse:null   c.FaturaContasReceberP.NotaFiscalProdutos!=null? " NFe: "   c.FaturaContasReceberP.NotaFiscalProdutos:null,
  

Комментарии:

1. Как не работает, отображается только NFSe , даже если он равен null