Решил C# Linq, чтобы найти запись, которая соответствует условию, если эта запись найдена, верните все связанные записи
Моя проблема : я ищу транзакции по счету, которые произошли в определенный день. Если я нахожу транзакцию на этот день, мне нужно собрать историю транзакций для счета и связать ее вместе. Мое текущее решение требует 2 операторов linq для правильного восстановления данных. Но у меня есть несколько других вызовов DB, поэтому я пытаюсь уменьшить нагрузку
Мое текущее решение : Во-первых, я использую оператор linq для сбора всех транзакций, которые происходят в этот день и верните только номер счета. Затем я повторяю почти тот же запрос, но на этот раз со всем, что мне нужно, и используя номер счета из первого запроса в предложении where. я также обнаружил, что linq не нравится, когда мой анонимный тип используется в предложении where, поэтому я преобразую номера счетов в список в промежуточном состоянии.
Мой запрос : может ли кто-нибудь помочь мне найти более эффективный способ восстановления данных, которые мне нужны? И если кто-то может предложить что-то изменить, я могу это сделать. с анонимной проблемой, я был бы признателен. Ошибка: не удалось создать постоянное значение типа "анонимный тип". В этом контексте поддерживаются только примитивные типы или типы перечисления.
Мой Код :
public ICollection<ACCOUNT_TRANS> GetTransactionsByDate(DateTime date)
{
//Get account transactions that occur on this date
var results = this.ACCOUNT_TRANS
.Select(at => new { at.FK_ACCOUNT, at.COMPLETION_DATE })
.Where(at => at.COMPLETION_DATE.Value.Day == date.Day &&
at.COMPLETION_DATE.Value.Month == date.Month &&
at.COMPLETION_DATE.Value.Year == date.Year)
.ToList();
//Extract Account Number and removes the anonymous nature of the data
var accountNums = results.Select(r => r.FK_ACCOUNT).ToList();
//Return Transaction history for all changed changed
var results2 = this.ACCOUNT_TRANS
.Include(at => at.ACCOUNT_TABLE1)
.Include(at => at.ACCOUNT_TABLE2)
.Include(at => at.ACCOUNT_TABLE3)
.Include(at => at.ACCOUNT_TABLE4)
.Where(at => accountNums.All(r => r == at.FK_ACCOUNT))
.ToList();
return results2;
}
Edit: вопрос решен, потому что у меня голова закружилась от попыток так много вещей. Вот каким должен быть код. Красиво и просто, как Linq намеревался быть:
public ICollection<ACCOUNT_TRANS> GetTransactionsByDate(DateTime date)
{
//Return Transaction history for all changed changed
var results = this.ACCOUNT_TRANS
.Include(at => at.ACCOUNT_TABLE1)
.Include(at => at.ACCOUNT_TABLE2)
.Include(at => at.ACCOUNT_TABLE3)
.Include(at => at.ACCOUNT_TABLE4)
.Where(at => at.COMPLETION_DATE.Value.Day == date.Day &&
at.COMPLETION_DATE.Value.Month == date.Month &&
at.COMPLETION_DATE.Value.Year == date.Year)
.ToList();
return results;
}
1 ответ:
Попробуйте выполнить этот запрос, только этот запрос.
var results2 = this.ACCOUNT_TRANS .Include(at => at.ACCOUNT_TABLE1) .Include(at => at.ACCOUNT_TABLE2) .Include(at => at.ACCOUNT_TABLE3) .Include(at => at.ACCOUNT_TABLE4) .Where(at => this.ACCOUNT_TRANS .Where(a => at.COMPLETION_DATE.Value.Day == date.Day && a.COMPLETION_DATE.Value.Month == date.Month && a.COMPLETION_DATE.Value.Year == date.Year) .Select(a => a.FK_ACCOUNT).Contains(at.FK_ACCOUNT)) .ToList();
Comments