예제 #1
0
        /// <summary>
        /// Вернуть загружаемые элементы, которые не записаны в историю.
        /// </summary>
        /// <param name="container">Контейнер.</param>
        /// <returns>Элементы, не записанные в историю.</returns>
        public static List <T> GetItemsWithoutHistory <T>(IDownloadableContainer <T> container) where T : IDownloadable
        {
            var internalContainer = container.Container.ToList();

            if (!internalContainer.Any())
            {
                return(internalContainer);
            }

            var uris = internalContainer.Select(c => c.Uri).ToList();

            // В многопоточном коде нельзя обращаться к одной сессии.
            List <Uri> exists;

            using (var session = Repository.GetEntityContext())
            {
                exists = session.Get <MangaHistory>().Where(h => uris.Contains(h.Uri)).Select(h => h.Uri).ToList();
            }

            foreach (var item in internalContainer.OfType <IDownloadableContainer <IDownloadable> >())
            {
                var wh = GetItemsWithoutHistory(item);
                if (wh.Any())
                {
                    exists.Remove(item.Uri);
                }
            }

            var historyNotFound = internalContainer.Where(c => uris.Except(exists).Contains(c.Uri)).ToList();

            return(historyNotFound.Where(c => c.DownloadedAt == null).ToList());
        }
예제 #2
0
        /// <summary>
        /// Вернуть загружаемые элементы, которые не записаны в историю.
        /// </summary>
        /// <param name="container">Контейнер.</param>
        /// <returns>Элементы, не записанные в историю.</returns>
        public static List <T> GetItemsWithoutHistory <T>(IDownloadableContainer <T> container) where T : IDownloadable
        {
            var internalContainer = container.Container.ToList();

            if (!internalContainer.Any())
            {
                return(internalContainer);
            }

            var uris = internalContainer.Select(c => c.Uri).Distinct().ToList();

            List <Uri> exists;

            using (var session = Mapping.GetStatelessSession())
            {
                exists = session.Query <MangaHistory>().Where(h => uris.Contains(h.Uri)).Select(h => h.Uri).ToList();
            }

            foreach (var item in internalContainer.OfType <IDownloadableContainer <IDownloadable> >())
            {
                var wh = GetItemsWithoutHistory(item);
                if (wh.Any())
                {
                    exists.Remove(item.Uri);
                }
            }

            var historyNotFound = internalContainer.Where(c => uris.Except(exists).Contains(c.Uri)).ToList();

            return(historyNotFound.Where(c => c.DownloadedAt == null).ToList());
        }