Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!
Шрифт:
Интервал:
Закладка:
{
}
}
Интерфейс хранилища данных о заказчиках
Откройте файл ICustomerRepo.cs. Интерфейс ICustomerRepo не добавляет никакой функциональности сверх той, что предоставляется в BaseRepo. Приведите код к такому виду:
using AutoLot.Models.Entities;
using AutoLot.Dal.Repos.Base;
namespace AutoLot.Dal.Repos.Interfaces
{
public interface ICustomerRepo : IRepo<Customer>
{
}
}
Интерфейс хранилища данных о производителях
Откройте файл IMakeRepo.cs. Интерфейс IMakeRepo не добавляет никакой функциональности сверх той, что предоставляется в BaseRepo. Обновите код, как показано ниже:
using AutoLot.Models.Entities;
using AutoLot.Dal.Repos.Base;
namespace AutoLot.Dal.Repos.Interfaces
{
public interface IMakeRepo : IRepo<Make>
{
}
}
Интерфейс хранилища данных о заказах
Откройте файл IOrderRepo.cs. Поместите в начало файла следующие операторы using:
using System.Collections.Generic;
using System.Linq;
using AutoLot.Models.Entities;
using AutoLot.Dal.Repos.Base;
using AutoLot.Models.ViewModels;
Измените интерфейс на public и реализуйте IRepo<Order>:
namespace AutoLot.Dal.Repos.Interfaces
{
public interface IOrderRepo : IRepo<Order>
{
IQueryable<CustomerOrderViewModel> GetOrdersViewModel();
}
}
Интерфейс на этом завершен, т.к. все необходимые конечные точки API раскрыты в базовом классе.
Реализация классов хранилищ, специфичных для сущностей
Большую часть своей функциональности реализуемые классы хранилищ получают от базового класса. Далее будут описаны функциональные средства, которые добавляются или переопределяют возможности, предлагаемые базовым классом хранилища. Создайте в каталоге Repos проекта AutoLot.Dal пять новых файлов классов хранилищ:
CarRepo.cs
CreditRiskRepo.cs
CustomerRepo.cs
MakeRepo.cs
OrderRepo.cs
Классы хранилищ будут реализованы в последующих разделах.
Хранилище данных об автомобилях
Откройте файл класса CarRepo.cs и поместите в его начало показанные ниже операторы using:
using System.Collections.Generic;
using System.Data;
using System.Linq;
using AutoLot.Dal.EfStructures;
using AutoLot.Models.Entities;
using AutoLot.Dal.Repos.Base;
using AutoLot.Dal.Repos.Interfaces;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
Измените класс на public, унаследуйте его от BaseRepo<Car> и реализуйте ICarRepo:
namespace AutoLot.Dal.Repos
{
public class CarRepo : BaseRepo<Car>, ICarRepo
{
}
}
Каждый класс хранилища должен реализовывать два конструктора из BaseRepo:
public CarRepo(ApplicationDbContext context) : base(context)
{
}
internal CarRepo(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
Добавьте переопределенные версии методов GetAll() и GetAllIgnoreQueryFilters() для включения свойства MakeNavigation и упорядочения по значению PetName:
public override IEnumerable<Car> GetAll()
=> Table
.Include(c => c.MakeNavigation)
.OrderBy(o => o.PetName);
public override IEnumerable<Car> GetAllIgnoreQueryFilters()
=> Table
.Include(c => c.MakeNavigation)
.OrderBy(o => o.PetName)
.IgnoreQueryFilters();
Реализуйте метод GetAllBy(). Перед выполнением он обязан установить фильтр для контекста. Включите навигационное свойство Make и отсортируйте по значению PetName:
public IEnumerable<Car> GetAllBy(int makeId)
{
return Table
.Where(x => x.MakeId == makeId)
.Include(c => c.MakeNavigation)
.OrderBy(c => c.PetName);
}
Добавьте переопределенную версию Find(), в которой включается свойство MakeNavigation, а фильтры запросов игнорируются:
public override Car? Find(int? id)
=> Table
.IgnoreQueryFilters()
.Where(x => x.Id == id)
.Include(m => m.MakeNavigation)
.FirstOrDefault();
Добавьте метод, который позволяет получить значение PetName, используя хранимую процедуру:
public string GetPetName(int id)
{
var parameterId = new SqlParameter
{
ParameterName = "@carId",
SqlDbType = SqlDbType.Int,
Value = id,
};
var parameterName = new SqlParameter
{
ParameterName = "@petName",
SqlDbType = SqlDbType.NVarChar,
Size = 50,
Direction = ParameterDirection.Output
};
_ = Context.Database
.ExecuteSqlRaw("EXEC [dbo].[GetPetName] @carId, @petName OUTPUT",
parameterId, parameterName);
return (string)parameterName.Value;
}
Хранилище данных о кредитных рисках
Откройте файл класса CreditRiskRepo.cs и поместите в его начало следующие операторы using:
using AutoLot.Dal.EfStructures;
using AutoLot.Dal.Models.Entities;
using AutoLot.Dal.Repos.Base;
using AutoLot.Dal.Repos.Interfaces;
using Microsoft.EntityFrameworkCore;
Измените класс на public, унаследуйте его от BaseRepo<CreditRisk>, реализуйте ICreditRiskRepo и добавьте два обязательных конструктора:
namespace AutoLot.Dal.Repos
{
public class CreditRiskRepo : BaseRepo<CreditRisk>, ICreditRiskRepo
{
public CreditRiskRepo(ApplicationDbContext context) : base(context)
{
}
internal CreditRiskRepo(
DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
}
Хранилище данных о заказчиках
Откройте файл класса CustomerRepo.cs и поместите в его начало приведенные далее операторы using:
using System.Collections.Generic;
using System.Linq;
using AutoLot.Dal.EfStructures;
using AutoLot.Dal.Models.Entities;
using AutoLot.Dal.Repos.Base;
using AutoLot.Dal.Repos.Interfaces;
using Microsoft.EntityFrameworkCore;
Измените класс на public, унаследуйте его от BaseRepo<Customer>, реализуйте ICustomerRepo и добавьте два обязательных конструктора:
namespace AutoLot.Dal.Repos
{
public class CustomerRepo : BaseRepo<Customer>, ICustomerRepo
{
public CustomerRepo(ApplicationDbContext context)
: base(context)
{
}
internal CustomerRepo(
DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
}
Наконец, добавьте метод, который возвращает все записи Customer с их заказами, отсортированные по значениям LastName:
public override IEnumerable<Customer> GetAll()
=> Table
.Include(c => c.Orders)
.OrderBy(o => o.PersonalInformation.LastName);
Хранилище данных о производителях
Откройте файл класса MakeRepo.cs и поместите в его начало перечисленные ниже операторы using:
using System.Collections.Generic;
using System.Linq;
using AutoLot.Dal.EfStructures;
using AutoLot.Dal.Models.Entities;
using AutoLot.Dal.Repos.Base;
using AutoLot.Dal.Repos.Interfaces;
using Microsoft.EntityFrameworkCore;
Измените класс на
Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.
Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.
- 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
- 2. Просьба отказаться от оскорблений, угроз и запугиваний.
- 3. Просьба отказаться от нецензурной лексики.
- 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.
Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.
Оставить комментарий
-
Гость Татьяна24 сентябрь 22:20 Как то не очень... Невеста по ошибке. Я не дам тебе развод - Майя Линн
-
Римма24 сентябрь 21:52 Почему главные героинитпкие идиотки? И сюжет не плохой, и написано хорошо. Но как героиня - так дура дурой.... Хозяйка маленького дома, или Любимая для дракона - Кира Рамис
-
Римма20 сентябрь 12:27 Много ненужных пояснений и отступлений. Весь сюжет теряет свою привлекательность. Героиня иногда так тупит, что читать не... Хозяйка приюта для перевертышей и полукровок - Елена Кутукова