微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 运行Linq语句的超时异常

这才刚刚开始发生.这个声明已经工作了几个月,现在我只是继续得到下面的超时错误.当我直接在SSMS上执行相同的语句时,它会在一秒钟内返回.该表有44k记录,并且是5列状态的索引,其中一列是其中之一.

select distinct(state) from [ZipCodeDatabase]

我正在运行以下linq语句

states = ZipCodeRepository.Get(orderBy: z => z.OrderBy(o => o.State)).Select(z => z.State).distinct().ToList();

当我运行这个linq语句时,我不断收到超时错误并且不知道y因为它之前正常工作.

我包含了Get()函数,它是一个通用的repo函数,但也许我在那里遗漏了一些东西,这导致了延迟.

获取功能

public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity,bool>> filter = null,Func<IQueryable<TEntity>,IOrderedQueryable<TEntity>> orderBy = null,string includeProperties = "") //params Expression<Func<TEntity,object>>[] includes
{
    IQueryable<TEntity> query = dbSet;
    if (filter != null)
    {
        query = query.Where(filter);
    }
    foreach (var includeProperty in includeProperties.Split
        (new char[] { ',' },StringSplitOptions.RemoveEmptyEntries))
    {
        query = query.Include(includeProperty);
    }

    if (orderBy != null)
    {
        return orderBy(query).ToList();
    }
    else
    {
        return query.ToList();
    }
}

超时错误

System.Data.sqlClient.sqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. —> System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out
at System.Data.sqlClient.sqlConnection.OnError(sqlException exception,Boolean breakConnection,Action1 wrapCloseInAction)
at System.Data.sqlClient.sqlInternalConnection.OnError(sqlException exception,Action
1 wrapCloseInAction)
at System.Data.sqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,Boolean callerHasConnectionLock,Boolean asyncclose)
at System.Data.sqlClient.TdsParser.TryRun(RunBehavior runBehavior,sqlCommand cmdHandler,sqlDataReader dataStream,BulkcopySimpleResultSet bulkcopyHandler,TdsParserStateObject stateObj,Boolean& dataReady)
at System.Data.sqlClient.sqlDataReader.TryCloseInternal(Boolean closeReader)
at System.Data.sqlClient.sqlDataReader.Close()
at System.Data.Common.DbDataReader.dispose(Boolean disposing)
at System.Data.Common.DbDataReader.dispose()
at System.Data.Common.Internal.Materialization.Shaper1.Finally()
at System.Data.Common.Internal.Materialization.Shaper
1.SimpleEnumerator.dispose()
at System.Collections.Generic.List1..ctor(IEnumerable1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source)
at ClientsToProfitsKendoUI.DAL.GenericRepository
1.Get(Expression1 filter,Func2 orderBy,String includeProperties)

解决方法

您只是为了选择不同的状态而实现数据库中的每一行.让数据库为您完成繁重的工作,只需返回状态而不是实现所有内容,然后让.Net执行此操作.

将其添加到ZipCodeRepository中

public IEnumerable<string> GetStates()
{
    return dbSet.OrderBy(e => e.State).Select(e => e.State).distinct();
}

请注意,导致实现(以及大量开销)的原因是ToList().

通常,将集合保留为IQueryable,直到您真正准备好使用结果.实际枚举集合EF的那一刻,无论如何都会实际执行查询.

或者,如果删除ToList()调用并将Get函数的返回类型更改为IQueryable< TEntity>这也应该解决这个问题.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐