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?