CrateDB прочитал 10 тыс. строк без итерации в клиенте Npgsql C #

#c# #npgsql #cratedb

#c# #npgsql #cratedb

Вопрос:

У меня есть данные 10 тыс. строк в базе данных crate. Как прочитать данные без итерации. Я использую клиент CrateDB C # Npgsql для своего сервиса.

 var connString = "Host=myserver;Username=mylogin;Password=mypass;Database=mydatabase";

await using var conn = new NpgsqlConnection(connString);
await conn.OpenAsync();
// Retrieve all rows
var cmd = new NpgsqlCommand("select * from sensordata where timestamp >= extract(epoch from (now() - interval '1 week'))", conn);
            var result = new List<SensorDataViewModel>();

           using (var reader = cmd.ExecuteReader())
            {
                    while(reader.HasRows amp;amp; reader.Read())
                    {
                       SensorDataViewModel item  = new SensorDataViewModel { 
                            sensorid = reader["sensorid"].ToString(),
                            deviceid = reader["deviceid"].ToString(),
                            reading = Convert.ToInt32(reader["reading"]),
                            timestamp = (double)reader["timestamp"]
                        };
                        result.Add(item);
                    }
            }
  

здесь я читаю каждую строку за раз в цикле while. это занимает много времени при обработке?

Комментарии:

1. Используйте адаптер данных (NpgsqlDataAdapter) и поместите данные в таблицу данных. Код будет выглядеть примерно так: learn.microsoft.com/en-us/dotnet/api /…

Ответ №1:

Возможно, вам нужно рассмотреть возможность использования EntityFrameworkCore. Для получения более подробной информации, пожалуйста, обратитесь к https://www.npgsql.org/efcore/index.html

Ниже приведен мой пример кода, который я пробовал. В CrateDB содержатся 2 таблицы. Один — клиенты, а другой — задача. Эта таблица имеет связь, в которой customer.id=todo.customer_id.

Первый и второй запрос внутри образца — это просто выбрать все записи из 2 таблиц соответственно.

Третий запрос использует join для извлечения связанных записей в соответствии с отношениями и фильтруется по customers.id .

     class Program
    {
        static async Task Main(string[] args)
        {
            MemoContext memoContext = new MemoContext();

            //select * from customers
            List<Customer> customers = memoContext.customers.Select(x => new Customer
            {
                id = x.id,
                name = x.name,
                contactno = x.contactno,
                email = x.email
            }).ToList();

            //select * from todo
            List<Todo> todos = memoContext.todo.Select(x => new Todo
            {
                complete = x.complete,
                customer_id = x.customer_id,
                id = x.id,
                title = x.title
            }).ToList();

            //SELECT c.name, c.email, c.contactno, t.title, t.complete 
            //FROM customers AS c 
            //JOIN todo AS t ON t.customer_id = c.id 
            //WHERE c.id=1
            var memo = memoContext.customers.Join(
                    memoContext.todo,
                    c => c.id,
                    t => t.customer_id,
                    (c, t) => new
                    {
                        id = c.id,
                        name = c.name,
                        email = c.email,
                        contactno = c.contactno,
                        todotitle = t.title,
                        complete = t.complete
                    }).Where(n => n.id == 1).ToList();
        }
    }


    class MemoContext : DbContext
    {
        public DbSet<Customer> customers { get; set; }
        public DbSet<Todo> todo { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            => optionsBuilder.UseNpgsql("Host=localhost;Port=5432;Username=crate;SSL Mode=Prefer;Database=doc");
    }
  

Я надеюсь, что это полезно для вас.