1

所以我搜索了互联网和 SO,但我似乎无法找到我的问题的答案。我看到一些地方人们可以取消事情,因为他们正在使用 IQueryable 但在我的情况下,我有一个存储库并且我正在返回一个列表,但我希望能够取消对仅返回数据的查询的调用 -嗯,我不知道我解释得很好。希望这个代码片段应该更清楚。

 public class EdiRepository : GenericRepository<EdiEventLog, Guid>, IEdiRepository
{
    private readonly ISessionStorage _sessionStorage;
    private ISession _session;

    public EdiRepository(ISessionStorage sessionStorage)
        : base(sessionStorage)
    {
        _sessionStorage = sessionStorage;
    }

    public void Cancel()
    {
        //Uhm, this doesn't seem like the right thing to do. 
        _session.Dispose();
    }

    public IList<EdiEventLog> GetAllLogs(List<String> eventTtypes)
    {
        _session = GetSession();

        var query = from q in _session.Query<EdiEventLog>()
                    where eventTtypes.Contains(q.EventType)
                    select q;

        return query.ToList();
    }
}

如果这是多余的并且我刚刚错过了它,请指出我正确的方向,但我所看到的一切都假设您正在返回并且 IQueryable 不是列表。

谢谢

4

2 回答 2

4

调用_session.CancelQuery();(当然来自不同的线程,因为您的查询线程将在查询调用时被阻塞)。它将抛出数据库特定的查询取消异常。

请注意,这仅在您的查询仍在数据库上运行时才有效。如果查询调用已经从返回的数据创建 .NET 对象,它不会取消任何内容。

于 2012-10-16T11:44:34.137 回答
-1

我会实现我自己的取消方法,它会更快地返回部分结果

public IEnumerable<IList<EdiEventLog>> GetAllLogs(List<String> eventTtypes)
{
    _session = GetSession();
    const int pagesize = 1000;
    int page = 0;
    var query = from q in _session.Query<EdiEventLog>()
                where eventTtypes.Contains(q.EventType)
                orderby q.Id   // to make sure repeated queries return consistent results
                select q;

    IList<EdiEventLog> results;
    do
    {
        results = query.Skip(page * pagesize).Take(pagesize).ToList();
        page++;
    } while(results.Count > 0);
}

并使用它

foreach(var someLogs in GetAllLogs(eventTypes))
{
    AddToGui(someLogs);
    if (userCanceled)
        break;
}
于 2012-10-16T12:00:53.987 回答