C# EntityFramework-使用IQueryable/IEnumerable查询数据;操作已在进行中”;错误仅在Npgsql.EF5中发生

C# EntityFramework-使用IQueryable/IEnumerable查询数据;操作已在进行中”;错误仅在Npgsql.EF5中发生,c#,entity-framework,ienumerable,npgsql,iqueryable,C#,Entity Framework,Ienumerable,Npgsql,Iqueryable,“操作已在进行”:EF 5的EntityFramework5.Npgsql的数据访问出现问题。 尽管相同的数据访问代码对oracle非常有效 为什么在迭代IEnumerable时会收到此错误?我认为情况不应该是这样,对于IEnumerables,数据已经加载到内存中 在IQueryable上执行where时也会接收到它。我们如何使用新的DbContext连接在Iqueryable/IEnumerable上进行多次过滤/迭代而不出现此错误 或者是否有任何一次性配置可用于为IQueryable/IE

“操作已在进行”:EF 5的EntityFramework5.Npgsql的数据访问出现问题。 尽管相同的数据访问代码对oracle非常有效

为什么在迭代IEnumerable时会收到此错误?我认为情况不应该是这样,对于IEnumerables,数据已经加载到内存中

在IQueryable上执行where时也会接收到它。我们如何使用新的DbContext连接在Iqueryable/IEnumerable上进行多次过滤/迭代而不出现此错误

或者是否有任何一次性配置可用于为IQueryable/IEnumerable上的每个操作使用新的DbContext


我不想更改代码,因为同一段代码对oracle非常有效。我正在做一个db不可知的应用程序

这是我的代码:

private IEnumerable<AuditListView> GetAuditList(string user = "", string entity = "", string module = "", string action = "", string start = "",
                                                         string end = "", string parentAuditLogId = "")
    {
        try
        {
            LoginBL loginBL = new LoginBL(LogCategory.Default);
            var list = _objBL.LoadAuditList(user, entity.Replace(" ", ""), module.Replace(" ", ""), action, start, end, parentAuditLogId).OrderByDescending(a => a.Item1.LogDateTime)?.ToList(); ;

            List<AuditListView> sublist = new List<AuditListView>();
            foreach (var item in list)
            {
                var view = new AuditListView();
                view.LogId = item.Item1.AuditLogId.ToString();
                view.Date = item.Item1.LogDateTime;
                view.Time = item.Item1.LogDateTime;
                view.Activity = item.Item1.ActionId;
                view.Module = item.Item1.ModuleId.PascalCaseToSentence();
                view.Description = item.Item1.Message;
                view.EntityType = item.Item1.EntityId.PascalCaseToSentence();
                view.EntityName = item.Item1.EntityValue;
                view.User = item.Item1.UserName;
                view.IsDetailsAvailable = item.Item2;
                view.IP = (loginBL.getIPBySessionID(item.Item1.SessionId) != null) ? loginBL.getIPBySessionID(item.Item1.SessionId) : (item.Item1.IPAddress != null) ? item.Item1.IPAddress : "N/A";
                view.ChannelId = (item.Item1.ChannelId != 0) ? Convert.ToString(item.Item1.ChannelId) : "N/A";
                view.IsChildAvailable = (item.Item1.ChildEntries.Count > 0) ? true : false;
                sublist.Add(view);
            }

            return sublist;
        }

        catch (Exception ex)
        {
            //Exception handling
            return null;
        }
    }
private IEnumerable GetAuditList(字符串用户=”,字符串实体=”,字符串模块=”,字符串操作=”,字符串开始=”,
字符串end=“”,字符串parentAuditLogId=“”)
{
尝试
{
LoginBL LoginBL=新的LoginBL(LogCategory.Default);
var list=_objBL.LoadAuditList(用户、实体.Replace(“,”)、模块.Replace(“,”)、操作、开始、结束、parentAuditLogId).OrderByDescending(a=>a.Item1.LogDateTime)?.ToList();
列表子列表=新列表();
foreach(列表中的变量项)
{
var view=新的AuditListView();
view.LogId=item.Item1.AuditLogId.ToString();
view.Date=item.Item1.LogDateTime;
view.Time=item.Item1.LogDateTime;
view.Activity=item.Item1.ActionId;
view.Module=item.Item1.ModuleId.PascalCasetoContent();
view.Description=item.Item1.Message;
view.EntityType=item.Item1.EntityId.PascalCaseToSentence();
view.EntityName=item.Item1.EntityValue;
view.User=item.Item1.UserName;
view.IsDetailsAvailable=item.Item2;
view.IP=(loginBL.getIPBySessionID(item.Item1.SessionId)!=null)?loginBL.getIPBySessionID(item.Item1.SessionId):(item.Item1.IPAddress!=null)?item.Item1.IPAddress:“不适用”;
view.ChannelId=(item.Item1.ChannelId!=0)?Convert.ToString(item.Item1.ChannelId):“不适用”;
view.IsChildAvailable=(item.Item1.ChildEntries.Count>0)?true:false;
子列表.添加(视图);
}
返回子列表;
}
捕获(例外情况除外)
{
//异常处理
返回null;
}
}
加载审核列表功能:

        public IEnumerable<Tuple<AuditLog, bool>> LoadAuditList(string user = "", string entity = "", string module = "", string action = "", string start = "", string end = "", string parentAuditLogId = "")
    {
        DateTime startDate = (start != "") ? DateTime.ParseExact(start, ConfigReader.DbDateTimeFormat, CultureInfo.CurrentCulture) : DateTime.Today;
        DateTime endDate = (end != "") ? DateTime.ParseExact(end, ConfigReader.DbDateTimeFormat, CultureInfo.CurrentCulture) : DateTime.Now;
        List<string> sessionIds = new List<string>();
        // Get all the audit entries
        IEnumerable<AuditLog> audit = null;
        if (string.IsNullOrEmpty(parentAuditLogId))
        {
            // getting all the records having parent Id is null.
            audit = _entities.AuditLogs.Where(l => l.LogDateTime >= startDate && l.LogDateTime <= endDate &&
                                                                                                     l.ParentId == null);
        }
        else
        {
            // getting all the records having the given parent Id.
            decimal dParentAuditLogId = Convert.ToDecimal(parentAuditLogId);
            audit = _entities.AuditLogs.Where(p => p.ParentId == dParentAuditLogId);
        }


        // Apply filters according to the parameters

        if (user != "")
        {
            // Get the List of all the audit log entries that fall in the given sessions.
            audit = audit.Where(a => a.UserName != null && a.UserName.ToLower() == user.ToLower());
        }

        return audit.Select(a => Tuple.Create(a, a.AuditDetails.Any()));
    }
public IEnumerable LoadAuditList(字符串用户=”,字符串实体=”,字符串模块=”,字符串操作=”,字符串开始=”,字符串结束=”,字符串父AuditLogid=”)
{
DateTime startDate=(start!=“”)?DateTime.ParseExact(start,ConfigReader.DbDateTimeFormat,CultureInfo.CurrentCulture):DateTime.Today;
DateTime endDate=(end!=“”)?DateTime.ParseExact(end,ConfigReader.DbDateTimeFormat,CultureInfo.CurrentCulture):DateTime.Now;
List sessionIds=新列表();
//获取所有审核条目
IEnumerable audit=null;
if(string.IsNullOrEmpty(parentAuditLogId))
{
//获取具有父Id的所有记录为空。
audit=\u entities.AuditLogs.Where(l=>l.LogDateTime>=startDate&&l.LogDateTime p.ParentId==dparentuditlogid);
}
//根据参数应用过滤器
如果(用户!=“”)
{
//获取属于给定会话的所有审核日志项的列表。
audit=audit.Where(a=>a.UserName!=null&&a.UserName.ToLower()==user.ToLower());
}
return audit.Select(a=>Tuple.Create(a,a.AuditDetails.Any());
}
异常消息: 堆栈跟踪: 2021年1月4日01:54:42下午|错误|六进制值:0x12306370。小数点:305161072 ErrorMessage:执行命令定义时出错。有关详细信息,请参见内部异常。。ErrorInnerMessage:System.InvalidOperationException:操作已在进行中。在System.Data.EntityClient.EntityCommandDefinition.ExecutedCommandRecommands(EntityCommand EntityCommand,CommandBehavior行为)的Npgsql.Npgsql.NpgsqlConnector.StartUserAction(ConnectorState newState)的Npgsql.NpgsqlCommand.ExecuteDbDataReaderInternal(CommandBehavior行为)的Npgsql.Npgsql。ErrorSource:System.Data.Entity。ErrorStack:at System.Data.EntityClient.EntityCommandDefinition.ExecuteStorommands(EntityCommand和EntityCommand,CommandBehavior行为)at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext上下文,ObjectParameterCollection参数值)at System.Data.Objects.ObjectQuery
1.GetResults在System.Data.Objects.DataClasses.EntityCollection
1.Load(List
1 collection,MergeOption,MergeOption)在System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad()在System.Data.Objects.Internal.LazyLoadBehavior.LoadProperty[TItem]处加载(列表
1 collection,MergeOption,MergeOption)在System.Data.Objects.Internal.LazyLoadBehavior.c_uDisplayClass0_0
2.b_u1(TProxy proxy,TItem item)在System.Data.Entity.DynamicProxies.AuditLog_70A94E5E6B9A45522eC418B81AED462515790101D2f7863A431EED685CB7F6.get_AuditDetails()在BLL\AuditLogBL.cs中的Models.AuditLog.BLL.AuditLogBL.c.b_uu7_5(AuditLog a):System.Linq.Enumerable.whereselectEnumerableInterator
2.MoveNext()at System.Linq.Buffer
1..ctor(IEnumerable
1 source)at System.Linq.OrderedEnumerable`1.d_u1.MoveNext(