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();
    }
}

これが冗長で、見逃した場合は、正しい方向に向けてください。

ありがとう

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 に答える