Nano Hash - криптовалюты, майнинг, программирование

SQLite.Net-PCL Странное поведение при выборе

Использование любого из пакетов NuGet: SQLite.Net-PCL — платформа Win32, SQLite.Net-PCL — платформа XamarinIOS или платформа SQLite.Net-PCL XamarinAndroid У меня вообще проблемы с выбором. В частности, всякий раз, когда я выбираю из базы данных либо в LINQ, либо в необработанном SQL, я возвращаю то, что кажется объектом, содержащим значения по умолчанию.

Вот пример консольного приложения для демонстрации моей проблемы:

using System;
using System.Linq;
using SQLite.Net;
using SQLite.Net.Platform.Win32;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Open a connection to the database
            using (var database = new SQLiteConnection(new SQLitePlatformWin32(), "db.db"))
            {
                // Create a simple table
                database.CreateTable<Entity>();

                // Add a simple record to it each time we start the application
                database.Insert(new Entity { Data = Guid.NewGuid().ToString(), BoolData = true, IntData = 5 });

                Console.WriteLine("---------> Inserted item:");

                // Display all our records
                foreach (var e in database.Table<Entity>())
                {
                    Console.WriteLine(e);
                }

                Console.WriteLine(Environment.NewLine);
                Console.WriteLine("---------> Linq select Ids:");

                // For every record we'll select the Id field - this is not working
                foreach (var e in database.Table<Entity>().Select(e => e.Id))
                {
                    Console.WriteLine(e);
                }

                Console.WriteLine(Environment.NewLine);
                Console.WriteLine("---------> Id by scalar query:");

                // Let's try going after a value explicitly - this is fine
                var r1 = database.ExecuteScalar<int>("SELECT Id FROM Entity WHERE Id == 1");

                Console.WriteLine(r1);
                Console.WriteLine(Environment.NewLine);
                Console.WriteLine("---------> Ids by query:");

                // So lets try going after our Id field from a query - this still dosen't work
                foreach (var e in database.Query<int>("SELECT Id FROM Entity"))
                {
                    Console.WriteLine(e);
                }

                Console.WriteLine(Environment.NewLine);
                Console.WriteLine("---------> Linq select Ids after force to memory:");

                // Now lets try forcing a where to execute before performing the select - this works but it's bad
                foreach (var e in database.Table<Entity>().Where(e => e.IntData == 5).ToList().Select(e => e.Id))
                {
                    Console.WriteLine(e);
                }

                Console.ReadKey();
            }
        }
    }
}

Entity — это просто POD:

using SQLite.Net.Attributes;

namespace ConsoleApplication1
{
    public class Entity
    {
        public Entity() { }

        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }

        public string Data { get; set; }

        public int IntData { get; set; }

        public bool BoolData { get; set; }

        public override string ToString()
        {
            return string.Format("Id: {0}, Data: {1}, IntData: {2}, BoolData: {3}", Id, Data, IntData, BoolData);
        }
    }
}

Таким образом, единственный способ, которым я смог заставить его работать, - это сначала принудительно указать место в памяти ... это плохо в случае, когда у нас могут быть данные, содержащие BLOB и т. д., которые нас не интересуют.

Это поведение преднамеренное или я что-то пропустил?


Ответы:


1

Я решил это, используя класс POD, содержащий дискретные поля, которые я запрашивал с помощью метода SQLIteConnection.Query("Some SQL query"). Где T будет конкретным POD, содержащим интересующие поля. Пока имена полей совпадали с полями, перечисленными после SELECT, их можно было сопоставить.

Я все еще думаю, что это далеко не идеально, потому что мы не хотим создавать кучу классов для представления каждого результата запроса. Мы можем что-то сделать с анонимными типами, но это, скорее всего, грязный и дорогой во время выполнения.

14.11.2014

2

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

int id = GetID();
using(var connection = Db.getConnection())
{
    var result = connection.Table<Entity>().where(x=> x.id == id).firsOrDefault();
    if(result != null)
    { 
        //record found
    }
    else
    {
        //not found
    }
}
07.11.2014
  • Это работает, потому что вы все еще загружаете объекты в память. Моя проблема заключается в том, что я пытаюсь выбрать поле, прежде чем помещать объект в память. 10.11.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..