Έχω αυτό το ερώτημα και λαμβάνω το σφάλμα σε αυτή τη συνάρτηση:
var accounts = from account in context.Accounts
from guranteer in account.Gurantors
select new AccountsReport
{
CreditRegistryId = account.CreditRegistryId,
AccountNumber = account.AccountNo,
DateOpened = account.DateOpened,
};
return accounts.AsEnumerable()
.Select((account, index) => new AccountsReport()
{
RecordNumber = FormattedRowNumber(account, index + 1),
CreditRegistryId = account.CreditRegistryId,
DateLastUpdated = DateLastUpdated(account.CreditRegistryId, account.AccountNumber),
AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber)
})
.OrderBy(c=>c.FormattedRecordNumber)
.ThenByDescending(c => c.StateChangeDate);
public DateTime DateLastUpdated(long creditorRegistryId, string accountNo)
{
return (from h in context.AccountHistory
where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo
select h.LastUpdated).Max();
}
Το σφάλμα είναι:
Υπάρχει ήδη ένας ανοικτός DataReader που σχετίζεται με αυτή την εντολή, ο οποίος πρέπει πρώτα να κλείσει.
Ενημέρωση:
Προστέθηκε ίχνος στοίβας:
InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.]
System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command) +5008639
System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command) +23
System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async) +144
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +87
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) +10
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +443
[EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details.]
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +479
System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute(ObjectContext context, ObjectParameterCollection parameterValues) +683
System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) +119
System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +38
System.Linq.Enumerable.Single(IEnumerable`1 source) +114
System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__3(IEnumerable`1 sequence) +4
System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle(IEnumerable`1 query, Expression queryRoot) +29
System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute(Expression expression) +91
System.Data.Entity.Internal.Linq.DbQueryProvider.Execute(Expression expression) +69
System.Linq.Queryable.Max(IQueryable`1 source) +216
CreditRegistry.Repositories.CreditRegistryRepository.DateLastUpdated(Int64 creditorRegistryId, String accountNo) in D:\Freelance Work\SuperExpert\CreditRegistry\CreditRegistry\Repositories\CreditRegistryRepository.cs:1497
CreditRegistry.Repositories.CreditRegistryRepository.<AccountDetails>b__88(AccountsReport account, Int32 index) in D:\Freelance Work\SuperExpert\CreditRegistry\CreditRegistry\Repositories\CreditRegistryRepository.cs:1250
System.Linq.<SelectIterator>d__7`2.MoveNext() +198
System.Linq.Buffer`1..ctor(IEnumerable`1 source) +217
System.Linq.<GetEnumerator>d__0.MoveNext() +96
Αυτό μπορεί να συμβεί αν εκτελέσετε ένα ερώτημα ενώ επαναλαμβάνετε τα αποτελέσματα ενός άλλου ερωτήματος. Δεν είναι σαφές από το παράδειγμά σας πού συμβαίνει αυτό, επειδή το παράδειγμα δεν είναι πλήρες.
Ένα πράγμα που μπορεί να το προκαλέσει αυτό είναι η τεμπέλικη φόρτωση που ενεργοποιείται κατά την επανάληψη των αποτελεσμάτων κάποιου ερωτήματος.
Αυτό μπορεί εύκολα να λυθεί επιτρέποντας το MARS στη συμβολοσειρά σύνδεσής σας. Προσθέστε το MultipleActiveResultSets=true
στο τμήμα του παρόχου της συμβολοσειράς σύνδεσής σας (όπου καθορίζονται η πηγή δεδομένων, ο αρχικός κατάλογος κ.λπ.).
Μπορείτε να χρησιμοποιήσετε τη μέθοδο ToList()
πριν από τη δήλωση return
.
var accounts =
from account in context.Accounts
from guranteer in account.Gurantors
select new AccountsReport
{
CreditRegistryId = account.CreditRegistryId,
AccountNumber = account.AccountNo,
DateOpened = account.DateOpened,
};
return accounts.AsEnumerable()
.Select((account, index) => new AccountsReport()
{
RecordNumber = FormattedRowNumber(account, index + 1),
CreditRegistryId = account.CreditRegistryId,
DateLastUpdated = DateLastUpdated(account.CreditRegistryId, account.AccountNumber),
AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber)}).OrderBy(c=>c.FormattedRecordNumber).ThenByDescending(c => c.StateChangeDate).ToList();
public DateTime DateLastUpdated(long creditorRegistryId, string accountNo)
{
var dateReported = (from h in context.AccountHistory
where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo
select h.LastUpdated).Max();
return dateReported;
}
Φαίνεται ότι καλείτε το DateLastUpdated μέσα από ένα ενεργό ερώτημα που χρησιμοποιεί το ίδιο πλαίσιο EF και το DateLastUpdate εκδίδει μια εντολή προς το ίδιο το κατάστημα δεδομένων. Το Entity Framework υποστηρίζει μόνο μία ενεργή εντολή ανά πλαίσιο κάθε φορά.
Μπορείτε να αναδιαμορφώσετε τα δύο παραπάνω ερωτήματά σας σε ένα ως εξής:
return accounts.AsEnumerable()
.Select((account, index) => new AccountsReport()
{
RecordNumber = FormattedRowNumber(account, index + 1),
CreditRegistryId = account.CreditRegistryId,
DateLastUpdated = (
from h in context.AccountHistory
where h.CreditorRegistryId == creditorRegistryId
&& h.AccountNo == accountNo
select h.LastUpdated).Max(),
AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber)
})
.OrderBy(c=>c.FormattedRecordNumber)
.ThenByDescending(c => c.StateChangeDate);
Παρατήρησα επίσης ότι καλείτε συναρτήσεις όπως FormattedAccountNumber και FormattedRecordNumber στα ερωτήματα. Εκτός αν πρόκειται για αποθηκευμένες procs ή συναρτήσεις που έχετε εισάγει από τη βάση δεδομένων σας στο μοντέλο δεδομένων οντοτήτων και τις έχετε αντιστοιχίσει σωστά, αυτές θα ρίξουν επίσης excepts καθώς το EF δεν θα ξέρει πώς να μεταφράσει αυτές τις συναρτήσεις σε εντολές που μπορεί να στείλει στο κατάστημα δεδομένων.
Σημειώστε επίσης ότι η κλήση του AsEnumerable δεν αναγκάζει το ερώτημα να εκτελεστεί. Μέχρι να αναβληθεί η εκτέλεση του ερωτήματος μέχρι να απαριθμηθεί. Μπορείτε να εξαναγκάσετε την απαρίθμηση με την ToList ή την ToArray αν το επιθυμείτε.