Как применить фильтрацию диапазона дат во временной таблице с помощью запроса LINQ?C#

Место общения программистов C#
Anonymous
Как применить фильтрацию диапазона дат во временной таблице с помощью запроса LINQ?

Сообщение Anonymous »

У меня есть темпоральная таблица в SQL Server, в которой хранятся версии таблицы адресов (история версий), а столбцы ValidFrom и ValidTo представляют историю версий. В моем приложении я настроил сущность «Адрес» с помощью Entity Framework с настройками временной таблицы следующим образом:

Код: Выделить всё

public class Address : EntityBase
{
public string Name { get; set; }
public string AddressString { get; set; }
public bool IsDeleted { get; set; }
public DateTime? DateDeleted { get; set; }
public string? DeletedBy { get; set; }
}

protected override void ConfigureCore(EntityTypeBuilder builder)
{
builder.ToTable("Addresses", b => b.IsTemporal(
b =>
{
b.HasPeriodStart("ValidFrom");
b.HasPeriodEnd("ValidTo");
b.UseHistoryTable("AddressesHistory");
}));
}
Чтобы получить один адрес, я применяю приведенный ниже код linq, и все в порядке:

Код: Выделить всё

        public async Task GetAtDate(long Id, DateTime utcDate)
{
return await context.Addresses.TemporalAsOf(utcDate).FirstOrDefaultAsync(h => h.Id == Id);
}
Но для получения адресов этот подход мне не подходит.
Я хочу фильтровать адреса по диапазону дат, но я возникли проблемы с написанием правильного запроса LINQ для достижения этой цели. Фильтры даты ValidFrom и ValidTo не применяются должным образом.
мой текущий код:

Код: Выделить всё

public async Task GetAddressesAtDatesAsync(List idDateTicksList)
{
// Convert to a dictionary for better access to data.
var idDateDictionary = idDateTicksList.ToDictionary(
item => item.Item1,
item => new DateTime(item.Item2)
);

// Get all addresses with id.
var ids = idDateDictionary.Keys.ToList();
var addresses = await context.Addresses.Where(h => ids.Contains(h.Id)).ToListAsync();

// Filter addresses by date tickes.
var result = addresses
.Where(h => idDateDictionary.ContainsKey(h.Id) && h.ValidFrom = idDateDictionary[h.Id])
.ToList();

return result ?? new List();
}
Похоже, что запрос неправильно применяет фильтрацию по дате. Я гарантирую, что даты верны, потому что я написал SQL-запрос, и он правильный. Как мне изменить этот запрос LINQ, чтобы правильно фильтровать адреса по диапазону дат validfrom и validTo во временной таблице?
получить несколько данных по диапазону дат во временной таблице.


Подробнее здесь: https://stackoverflow.com/questions/788 ... linq-query

Вернуться в «C#»