Хранить набор целочисленных значений в Sql Server 2005 с помощью nHibernate?

int(n**0.5) - это значение пола sqrt (n), которое вы путаете с мощностью 2 из n (n**2). Если n является не простым, то должно быть два числа 1 < i <= j < n такие, что: i * j = n.

Теперь, поскольку sqrt(n) * sqrt(n) = n, предполагая, что один из i,j больше (или равен) sqrt(n) - это означает, что другой должен быть меньше (или равен) sqrt(n) .

Так как это так, достаточно для повторения целых чисел в диапазоне [2, sqrt(n)]. И это именно тот код, который был опубликован.

Если вы хотите выйти в качестве реального смартфона, используйте следующую однострочную функцию:

import re
def is_prime(n):    
    return not re.match(r'^1?$|^(11+?)\1+$',n*'1')

Объяснение для «магического регулярного выражения» можно найти здесь

1
задан Amitabh 29 June 2010 в 11:20
поделиться

1 ответ

Предполагая, что этот класс

class MyEntity
{
  //...
  public IList<int> Integers { get; private set; }
}

Просто сопоставьте его как набор.

<class name="MyEntity">
  <!-- ... -->
  <set name="Integers" table="MyEntity_Integers">
    <key column="MyEntity_FK"/>
    <element type="Int32" column="Value"/>
  </set>
</class>

Вы можете попробовать отфильтровать коллекцию по:

from MyEntity e 
where e.Integers in (:set) 
  and size(e.Integers) = :setSize

Это, вероятно, не очень быстро.


Совершенно другой подход: хранить целые числа в некоторой сериализованной форме в одном текстовом поле.

Вы можете написать свой собственный пользовательский тип NHibernate. Перед сохранением отсортируйте целые числа. Вы можете сохранить их в таком формате, как «2; 45; 78; 898» . Фильтрация будет очень быстрой, потому что она просто соответствует строке. Изменить коллекцию в базе данных может быть сложно. Другая проблема в том, что длина столбца ограничена.

Вот пример реализации пользовательского типа NHibernate.

2
ответ дан 2 September 2019 в 23:25
поделиться
Другие вопросы по тегам:

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