Решил 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;
}
553   1  

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

    Ничего не найдено.