Kami menggunakan NHibernate melalui SQL Server dan SQLite. Basis data menyimpan catatan dalam baris, bukan kolom -- setiap baris memiliki Path|Value sebagai kolom. Path dan Value keduanya merupakan properti string.

Untuk nilai Path tertentu, kami ingin menanyakan ketidaksetaraan -- lebih besar dari, kurang dari, dll.

Masalah yang kami alami adalah karena propertinya adalah string, ketidaksetaraan menggunakan perbandingan string -- misalnya, mencari Value >= 18 mengembalikan baris di mana Value = 5. Sayangnya kami mengalami kesulitan untuk mengatasi hal ini.

1) Pembatasan ini menghasilkan hasil yang salah (mengatakan 18 < 5):

Restrictions.Ge("Value", item.Value);

2) Kami mencoba memberikan nilai ke bilangan bulat, tetapi kode ini menghasilkan SqlException dari NHibernate -- Error converting data type nvarchar to bigint.

Restrictions.Le(Projections.Cast(NHibernateUtil.Int64, Projections.Property("SearchString")), item.Value)

3) Kami sedang mencari cara untuk mengisi nilai properti dengan nol (sehingga kami akan mendapatkan 018 > 005), tetapi tidak dapat menemukan cara untuk melakukan ini di NHibernate.

Apakah ada yang punya saran?
Terima kasih sebelumnya!

2
dythim 30 Mei 2020, 02:44

1 menjawab

Jawaban Terbaik

Dengan asumsi bahwa Anda ingin membandingkan nilai integer, dengan IQueryOver:

1) Pembatasan ini menghasilkan hasil yang salah (mengatakan 18 < 5):

Restrictions.Ge("Value", item.Value);

Restrictions.Ge
    (
    Projections.Cast(NHibernateUtil.Int32, Projections.Property<YourEntity>(x => x.YourProperty))
        , intValue
    )

Konversi tipe data Anda sesuai. Jika tipe data C# Anda (intValue) sudah numerik, tidak perlu mengonversinya. Jika x.YourProperty Anda sudah bertipe numerik, tidak perlu mengonversinya. Sesuaikan kode di atas sesuai.

2) Kami mencoba memberikan nilai ke bilangan bulat, tetapi kode ini menghasilkan SqlException dari NHibernate -- Error converting data type nvarchar to bigint.

Restrictions.Le(Projections.Cast(NHibernateUtil.Int64, Projections.Property("SearchString")), item.Value)

Lihat di atas dan periksa tipe data item.Value.

2
Amit Joshi 1 Juni 2020, 13:20