Mostrar resultado de SELECT com INNER JOIN ASP.NET WEB API C#?

Estou tentando retornar o resultado de uma SQL com INNER JOIN em uma API REST em C# mas não estou conseguindo, não posso usar frameworks, tem que ser na base do código, já procurei bastante mas só acho com frameworks, segue o código:

Model:

public class Marca
{
    public int MarcaId { get; set; }
    public string Nome { get; set; }
    public Patrimonio patrimonio;
}

Repositório:

public List<Marca> GetComposto(int marcaId)
{
	List<Marca> marcas = new List<Marca>();
	List<Patrimonio> patrimonios = new List<Patrimonio>();
	SqlCommand query = new SqlCommand();
	connection.Open();
	query.Connection = connection;
	query.CommandText = @"SELECT Patrimonio.Nome, Patrimonio.MarcaId, NumeroTombo, Descricao FROM Marca INNER JOIN Patrimonio ON  Marca.MarcaId = Patrimonio.MarcaId  WHERE Marca.MarcaId = @marcaId;";

	query.Parameters.AddWithValue("@marcaId", marcaId);

	SqlDataReader leitura = query.ExecuteReader();

	while (leitura.Read())
	{
		Marca marca = new Marca();
		Patrimonio patrimonio = new Patrimonio();
		marca.patrimonio.Nome = (string)leitura["Nome"];
		marca.patrimonio.MarcaId =  (int)leitura["MarcaId"];
		marca.patrimonio.NumeroTombo = (int)leitura["NumeroTombo"];
		marca.patrimonio.Descricao = (string)leitura["Descricao"];

		marcas.Add(marca);

	}
	return marcas;
}

Controller:

[Route("api/marca/patrimonio")] 
public List<Marca> GetComposto(int marcaId)
{
    try
    {
        using (RepositorioMarca conexao = new RepositorioMarca())
        {
            marcas = conexao.GetComposto(marcaId);
            return marcas;
        }
    }
    catch (SqlException e)
    {
        return null;
    }
}

Esta dando o erro:

Referência de objeto não definida para uma instância de um objeto" na Classe de repositório, em todas as linhas que tento construir o patrimonio(marca.patrimonio.Nome, marca.patrimonio.MarcaId

1 curtida

Na classe em seu construtor já inicia a variável Patrimonio, exemplo:

public class Marca
{
    public Marca()
    {
        Patrimonio = new Patrimonio();
    }
    public int MarcaId { get; set; }
    public string Nome { get; set; }
    public Patrimonio Patrimonio { get; set; }
}

e no Repository eu faria o seguinte:

while (leitura.Read())
{
	Marca marca = new Marca();
	marca.Patrimonio.Nome = (string)leitura["Nome"];
	marca.Patrimonio.MarcaId =  (int)leitura["MarcaId"];
	marca.Patrimonio.NumeroTombo = (int)leitura["NumeroTombo"];
	marca.Patrimonio.Descricao = (string)leitura["Descricao"];
	marcas.Add(marca);
}

Um ponto a ser interessante é que você tinha um erro não instanciando o local correto e por isso da mensagem de erro.

Eu ainda faria melhor da seguinte forma:

public IEnumerable<Marca> GetComposto(int marcaId)
{	
	SqlCommand query = new SqlCommand();
	connection.Open();
	query.Connection = connection;
	Sql = " SELECT Patrimonio.Nome, Patrimonio.MarcaId, NumeroTombo, Descricao ";
	Sql += " FROM Marca INNER JOIN Patrimonio ON  Marca.MarcaId = Patrimonio.MarcaId "
    Sql += " WHERE Marca.MarcaId = @marcaId; "
	query.CommandText = Sql;
	query.Parameters.AddWithValue("@marcaId", marcaId);
	SqlDataReader leitura = query.ExecuteReader();
	while (leitura.Read())
	{
		yield return new Marca() 
		{
			Patrimonio.Nome = leitura.GetString(0);
			Patrimonio.MarcaId =  leitura.GetInt32(1);
			Patrimonio.NumeroTombo = leitura.GetInt32(2);
			Patrimonio.Descricao = leitura.GetString(3);
		};
	}
	query.Dispose();
	leitura.Close();
	leitura.Dispose();
	connection.Close();
	return marcas;
}