C#. EF лицо sql. Как получить сущность со связанными объектами?

Я сделал простую модель для примера.

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

    public string Title { get; set; }

    public Address Location { get; set; }

    public virtual ICollection<Book> Books { get; set; }
}

public class Address
{
    public string Country { get; set; }
    public string City { get; set; }
    public string Street { get; set; }
    public string HouseNumber { get; set; }
}  


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

    public string Title { get; set; }

    public string Author { get; set; }

    public int LanguageId { get; set; }

    public int? PublisherId { get; set; }
}

Мне нужно найти издателей с соответствующими книгами. Я знаю, как это сделать, используя linq для сущностей. Можно ли решить проблему с помощью сущности SQL?

    public class CatalogContext : DbContext {...}

    public List<Publisher> GetByCity(string city)
    {
        var result = new List<Publisher>();
        string queryString;
            queryString = String.Format(@"SELECT VALUE row(a,b) 
                                        FROM CatalogContext.Publishers AS a 
                                        join CatalogContext.Books AS b on a.Id = b.PublisherId
                                        WHERE a.Location.City = '{0}'", city);
        var rows = ((IObjectContextAdapter)_context).ObjectContext.CreateQuery<DbDataRecord>(queryString).ToList();
        return ???
    }

Запрос возвращает необходимые данные, но это List<DbDataRecord> - список пар <publisher, book>, Как перевести его в список издателей с заполненным навигационным свойством "Книги"? Можно ли написать запрос, который напрямую возвращает List<Publisher>?

1 ответ

Вы можете сделать следующее:

var result = ObjectContext.Publishers.Include("Books").Include("Locations")
.Where(c => c.Location.City = "SOME_CITY").Select(c => c);

Включить - в основном присоединяется к таблице.

Затем вы можете перейти к книгам, выполнив следующие действия:

var test = result[0].Books;

Почему вы используете прямую команду sql вместо стиля кода Entity Framework?

Другие вопросы по тегам