Я поднял вопрос, но ничего, что я нашел, не работает для меня. Я создал представление в SQL, которое работает, когда вы запускаете его в Management Studio. При обращении к представлению из моего приложения MVC EF возвращает идентичные строки вместо строк с разными данными.
Таблица: Автомобили
- [Id]
- [Регистрация]
- [Make]
- [модель]
Таблица: Бронирование
- [BookingStartDate]
- [BookingEndDate]
- [CarId]
Просмотр: CarBookings
SELECT [C].[Id],
[C].[Registration],
[C].[Make],
[C].[Model],
[B].[BookingStartDate],
[B].[BookingEndDate]
FROM [Cars] AS C INNER JOIN [Bookings] AS B ON C.Id = B.CarId
Если я запускаю запрос в SSMS, я получаю все ожидаемые результаты, например:
- Автомобиль 1, забронировано 12/03/2018
- Автомобиль 1, забронировано 19/09/2018
Когда я получаю доступ к тому же представлению из моего приложения MVC, я получаю:
- Автомобиль 1, забронировано 12/03/2018
- Автомобиль 1, забронировано 12/03/2018
Размещение точки останова на контроллере показывает, что результаты одинаковы, поэтому причиной является не уровень представления. Фильтры не применяются и нет условий вообще.
Я использую KendoUI
и возвращаю свои результаты в Grid
.
Вот код моего контроллера для получения данных:
HomeController.cs
public ActionResult GetBookings([DataSourceRequest] DataSourceRequest request)
{
var bookings = unitOfWork.BookingsRepository.Get();
var result = bookings.ToDataSourceResult(request);
return Json(result, JsonRequestBehavior.AllowGet);
}
Мое приложение использует общий репозиторий. Я не уверен, если это вызывает проблему, но стоит упомянуть. Вот метод GET
из моего хранилища.
DAL / GenericRepository.cs
public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "")
{
IQueryable<TEntity> query = dbSet;
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderBy != null)
{
return orderBy(query).ToList();
}
else
{
return query.ToList();
}
}
DAL / Context.cs
public DbSet<Bookings> Bookings { get; set; }
DAL / UnitOfWork.cs
private GenericRepository<Bookings> bookingsRepository;
public GenericRepository<Bookings> bookingsRepository
{
get
{
if (this.bookingsRepository == null)
{
this.bookingsRepository = new GenericRepository<Bookings>(context);
}
return bookingsRepository;
}
}
Класс сущности
Это класс, который представляет представление и обращается к нему с помощью аннотации [Table]
.
namespace MyProject.Models
{
[Table("CarBookings")]
public class Bookings
{
//Car
[Key]
public int Id { get; set; }
public string Registration { get; set; }
public string Make { get; set; }
public string Model { get; set; }
//Booking
public DateTime BookingStartDate { get; set; }
public DateTime BookingEndDateYearOfBuild { get; set; }
}
}
Когда я искал ответы на это, я читал, что представление не имеет ID
, поэтому EF пытается логически упорядочить записи по уникальным значениям, и это может иногда вызывать проблемы (источник: https://www.itworld.com/article/2833108/development/linq-in--net-returning-duplicate-rows-from-a-working-sql-view--solved-.html).
Я изменил свой код select
в соответствии с приведенной выше статьей, но он не работал для меня; Я все еще видел дубликаты:
SELECT ROW_NUMBER() OVER (ORDER BY Car.Id) AS NID,
Car.Id,
Booking.BookingStartDate
... etc...
FROM Cars AS Car INNER JOIN
Booking AS Booking ON Car.Id = Booking.Car_Id