Действительно ли возможно получить ленивый IEnumerable от запроса NHibernate с помощью ICriteria?

Ваше определение сложения не является общепринятым.

type family Add (m :: Nat) (n :: Nat) :: Nat where
  Add Zero n = n
  Add (Succ m) n = Add m (Succ n)

Это «хвостовая рекурсивная» добавка. Кажется, кажется, что должен быть способ доказать свои свойства, используя эту форму добавления, но я не могу понять это. До тех пор, с хвостовой рекурсией на уровне типа / свойства обычно работать гораздо сложнее, чем со стандартным видом:

type family Add (m :: Nat) (n :: Nat) :: Nat where
  Add Zero n = n
  Add (Succ m) n = Succ (Add m n)

Это последнее определение сложения делает ваш sum' проход без каких-либо убедительных все.


РЕДАКТИРОВАТЬ на самом деле это было легко, когда я увидел это правильно. Вот что я получил (импортировав Data.Type.Equality и включив LANGUAGE TypeOperators):

propSucc2 :: SNat m -> SNat n -> Add m (Succ n) :~: Succ (Add m n)
propSucc2 Zy _ = Refl
propSucc2 (Suc m) n = propSucc2 m (Suc n)

Хвосто-рекурсивное определение, хвост-рекурсивное доказательство. Затем, чтобы использовать его, вы используете gcastWith:

sum' (B m) (B n) = ...
        (Suc x, y) -> gcastWith (propSucc2 x y) 
                                (let B z = sum' (B x) (B y) in Suc z)

gcastWith просто берет равенство :~: и делает его доступным для средства проверки типов в рамках своего второго аргумента.

Кстати, если вы определили sum' в структуре, параллельной вашему семейству типов Add, то вам не нужны никакие леммы. Заставить вещи следовать параллельным структурам - хорошая техника, чтобы упростить задачу (это часть искусства зависимого программирования, поскольку не всегда очевидно, как):

sum' :: Bounded' (SNat m) -> Bounded' (SNat n) -> Bounded' (SNat (Add m n))
sum' (B Zy) (B n) = B n
sum' (B (Suc m)) (B n) = sum' (B m) (B (Suc n))
6
задан TheSoftwareJedi 12 December 2008 в 15:47
поделиться

3 ответа

ICriteria не имеет никаких методов, которые возвращают IEnumerable, но IQuery делает.

1
ответ дан 17 December 2019 в 22:15
поделиться

То, что Вы хотите сделать, является переносом Ваш доступ к данным в методе как так:

public IEnumerable<YourObject> GetALotOfRows() {
  ..execute DataReader
  while(..read..) {
    yield return yourObject;
  }
}

Не имейте VS или nHibernate удобным теперь, очень жаль о полупсевдо коде. Но ключ здесь должен использовать "возврат урожая".

0
ответ дан 17 December 2019 в 22:15
поделиться

Какая операция - это, что необходимо сделать это строка строкой? Мне просто любопытно :).

Вы могли попытаться разбить на страницы результаты - получают первые 10, следующие 10... и так далее.

Править: Таким образом, Вы имели бы

Session.CreateCriteria(typeof(T)).SetFirstResult(0).SetMaxResults(1).UniqueResult<T>();
Session.CreateCriteria(typeof(T)).SetFirstResult(1).SetMaxResults(1).UniqueResult<T>();
Session.CreateCriteria(typeof(T)).SetFirstResult(2).SetMaxResults(1).UniqueResult<T>();

Вы получаете изображение, я предполагаю, что это не лучший способ, это не IEnumerable..., но это работало бы. Вы могли также сделать SetMaxResults (10) или что-то большее, таким образом, не отправить 1 за один раз.

0
ответ дан 17 December 2019 в 22:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: