powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Архитектура приложения
66 сообщений из 66, показаны все 3 страниц
Архитектура приложения
    #38570830
sadata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветы.

Так как я ни разу не работал, ибо студент, и не знаю как реализуются реальные проекты у меня возник вопрос, к тем людям которые
представляют как должно быть на самом деле. Довольно тривиальная задача, уровня лабораторной работы. Хочу сделать ее идеально, так как бы сделал гуру. С одной стороны не должно быть портянок на которые пришлось бы тратить уйму времени для сопровождения, с другой не должно быть оверинженеринга, в общем все по уму.

Приложение - примитивный журнал документов. Входящие\исходящие, откуда и когда пришли краткое содержание etc

Итак, суть. Использую firebird + winforms.
Модель данных БД(2 таблицы):
1. T_DOC_TYPE //Типы документов
F_ID(PK) //ID
,F_NAME //Наименование
,F_DAY_TO_PERFORM //Дней до исполнения
,F_TO_ALARM //Дней до предупреждения

2. T_DOC //Документы
F_ID //ID
,F_DOC_TYPE(FK->T_DOCTYPE) //Тип документа
,остальные реквизиты документа

Хранимок и вьюх нет, есть по одному триггеру на таблицу для получения ID из сиквенса

С описанием БД закончил, теперь к приложеню)

Скрин главного окна для наглядности:

В меню справочники мы проваливаемся в окно для редактирования типов документов:

Есть еще одно маленькое окно для добавляения\редактирования типа документов в грид и в БД соответственно, потому что редактируемые гриды в приложении кажутся мне не кошерными

Теперь к коду

В коде форм ничего нету, кроме создания компоненов и обработчиков событий которые дергают все остальное в одну строчку
Есть 4 класса:
BindingINI, для чтения .ini файла в котором прописаны пути к БД и пути к шаблону отчетов .xls
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
namespace DocRegister
{
    public class BindingINI
    {
        /*
         * Чтение .ini файла
         * Параметры:
         *      (key) ключ в .ini файле
         * Возвращает:
         *      (string) значениe ключа key
         *      (null) если ключа key нет
         */
        public static string readSetting(string key)
        {
            string line;
            StreamReader srFile = new StreamReader(@"DRConfig.ini");
            while ((line = srFile.ReadLine()) != null)
            {
                if (line.Contains(key))
                {
                    srFile.Close();
                    return line.Substring(key.Length);
                }
            }
            srFile.Close();
            return line;
        }
    }
}


BindingDB, для подключения к БД и работе с ней
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
namespace DocRegister
{
    public class BindingDB
    {
        /*
         * Создание строки подключения с БД
         * Возвращает:
         *      (string) строка подключения 
         */
        private static string GetConString()
        {
            FbConnectionStringBuilder ConString = new FbConnectionStringBuilder();
            ConString.UserID = "SYSDBA";
            ConString.Password = "masterkey";
            ConString.Database = BindingINI.readSetting("DataBasePatch=");
            ConString.ServerType = 0;
            return ConString.ToString();
        }

        /*
         * Создание соединения с БД
         * Возвращает:
         *      (Connection) соединение с БД
         *      (null) если строка подключения невалидна
         */
        private static FbConnection GetConnection()
        {
            try
            {
                return new FbConnection(GetConString());
            } catch (System.ArgumentException exp) 
            {
                MessageBox.Show(exp.ToString(),
                                "Ошибка соединения с БД",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                return null;
            }
        }

        /*
         *  Получение данных из БД
         *  Параметры:
         *          (query) SQL запрос к БД
         *  Возвращает:
         *          (DataTable) результирующую таблицу SQL запроса
         *          (null) если не удалось подключится к БД или SQL запрос с ошибкой
         */
        public static DataTable GetTable(string query)
        {
            FbConnection connection = GetConnection();
            if (connection == null)
                return null;
            FbDataAdapter dAdapter = new FbDataAdapter(query, connection);
            DataSet dSet = new DataSet();
            try
            {
                dAdapter.Fill(dSet);
                return dSet.Tables[0];
            }
            catch (FbException exp) 
            {
                MessageBox.Show(exp.ToString(),
                                "Ошибка соединения с БД",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                return null;
            }
        }

        /*
         *  Добавление\Изменение\Удаление данных из БД
         *  Параметры:
         *          (query) SQL запрос к БД
         *  Возвращает: 
         *          (string) параметр из запроса          
         *          (string) "success" если запрос был без параметра 
         *          (null) если не удалось подключится к БД или SQL запрос с ошибкой
         */
        public static string SetTable(string query)
        {
            FbConnection connection = GetConnection();
            if (connection == null)
                return null;
            try
            {
                FbCommand command = new FbCommand(query, connection);
                FbParameter parameter = new FbParameter();
                parameter.Direction = ParameterDirection.Output;
                FbParameter parameter1 = new FbParameter();
                parameter1.Direction = ParameterDirection.Output;
                command.Parameters.Add(parameter);
                connection.Open();
                command.ExecuteNonQuery();
                connection.Close();
                if (command.Parameters[0].Value == null)
                    return "success";
                return command.Parameters[0].Value.ToString();
            }
            catch (FbException exp)
            {
                connection.Close();
                MessageBox.Show(exp.ToString(),
                                "Ошибка соединения с БД",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                return null;
            }
        }

        /*
         * Создает резервную копию БД
         * с наименованием в формате "dd.MM.yyyy.HH.mm.ss"
         * в директории с БД
         */
        public static void CreateBackup()
        {
            string patchNameBackup = BindingINI.readSetting("DataBasePatch=");
            string patchBackup = patchNameBackup.Substring(0, patchNameBackup.LastIndexOf(@"\") + 1);
            string nameBackup = System.DateTime.Now.ToString("dd.MM.yyyy.HH.mm.ss");
            try
            {
                FbBackup backup = new FbBackup { ConnectionString = GetConString() };                
                backup.BackupFiles.Add(new FbBackupFile(patchBackup + nameBackup + ".gbk", 2048));
                backup.Verbose = true;
                backup.Options = FbBackupFlags.IgnoreLimbo;
                backup.Execute();
            }
            catch (FbException exp)
            {
                MessageBox.Show(exp.ToString(),
                                "Ошибка соединения с БД",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }
    }
}


DocType, класс Тип документа, имеет методы добавления, изменения, удаления, работает с классом BindingDB
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
namespace DocRegister
{
    public class DocumentType
    {
        private SqlInt32 docTypeID;    //ID вида документа
        private SqlString name;        //Наименование
        private SqlInt32 dayToPerform; //Дней на исполнение
        private SqlInt32 dayToAlarm;   //Дней до предупреждения

        /*
         * Инициализирует новый тип документа
         */
        public DocumentType(SqlString Name, SqlInt32 DayToPerform, SqlInt32 DayToAlarm)
        {
            this.name = Name;
            this.dayToPerform = DayToPerform;
            this.dayToAlarm = DayToAlarm;
        }

        /*
         * Инициализирует уже существующий тип документа
         */
        public DocumentType(SqlInt32 DocTypeID, SqlString Name, SqlInt32 DayToPerform, SqlInt32 DayToAlarm)
        {
            this.docTypeID = DocTypeID;
            this.name = Name;
            this.dayToPerform = DayToPerform;
            this.dayToAlarm = DayToAlarm;
        }

        /*
         * Удаляет тип документа из БД
         */
        public void Delete()
        {
            BindingDB.SetTable("DELETE\n" +
                               "FROM T_DOC_TYPE\n" +
                               "WHERE F_ID = " + this.docTypeID.Value);
        }

        /*
         * Обновляет тип документа в БД
         */
        public void Update()
        {
            BindingDB.SetTable("UPDATE T_DOC_TYPE\n" +
                               "SET F_NAME = '" + this.name.Value + "'\n" +
                               "   ,F_DAY_TO_PERFORM = " + this.dayToPerform.Value + "\n" +
                               "   ,F_DAY_TO_ALARM = " + this.dayToAlarm.Value + "\n" +
                               "WHERE F_ID = " + this.docTypeID.Value);
        }

        /*
         * Добавляет тип документа в БД
         */
        public void Insert()
        {
            this.docTypeID = SqlInt32.Parse(BindingDB.SetTable("INSERT INTO T_DOC_TYPE (F_NAME\n" +
                                                               "                       ,F_DAY_TO_PERFORM\n" +
                                                               "                       ,F_DAY_TO_ALARM)\n" +
                                                               "VALUES\n" +
                                                               "('" + this.name.Value + "'\n" +
                                                               "," + this.dayToPerform.Value + "\n" +
                                                               "," + this.dayToAlarm.Value + ")\n" +
                                                               "RETURNING F_ID"));
        }
        
        public SqlInt32 DocTypeID
        {
            get { return docTypeID; }
        }

        public SqlString Name
        {
            get { return name; }
            set { name = value; }
        }

        public SqlInt32 DayToPerform
        {
            get { return dayToPerform; }
            set { dayToPerform = value; }
        }

        public SqlInt32 DayToAlarm
        {
            get { return dayToAlarm; }
            set { dayToAlarm = value; }
        }

    }
}


DocTypeCollection, класс Коллекция типов документа, имеет методы добавления, изменения, удаления, работает с классом DocType
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
namespace DocRegister
{
    public class DocTypeCollection
    {
        private BindingList<DocumentType> docTypes; //Коллекция типов документов

        public BindingList<DocumentType> DocTypes
        {
            get { return docTypes; }
        }

        /*
         * Инициализирует коллекцию типов документов
         * запрос к БД, выборка всех типов
         */
        public DocTypeCollection() 
        {
            docTypes = new BindingList<DocumentType>();
            DataTable table = BindingDB.GetTable("Select F_ID\n" +
                                                 "      ,F_NAME\n" +
                                                 "      ,F_DAY_TO_PERFORM\n" +
                                                 "      ,F_DAY_TO_ALARM\n" +
                                                 "From T_DOC_TYPE");
            foreach (DataRow dr in table.Rows)
            {
                this.docTypes.Add(new DocumentType((SqlInt32)((int)dr.ItemArray[0]),
                                                   (SqlString)((string)dr.ItemArray[1]),
                                                   (SqlInt32)((int)dr.ItemArray[2]),
                                                   (SqlInt32)((int)dr.ItemArray[3])));
            }
        }

        /*
         * Поиск типа документа в коллекции
         * Параметры:
         *      (docTypeID) ID типа документа
         * Возвращает:
         *      (DocumentType) ссылку на найденный тип документа
         *      (null) если тип документа не найден
         */
        public DocumentType SearchDocType(SqlInt32 DocTypeID)
        {
            IEnumerable<DocumentType> ie = from dt in DocTypes
                                           where dt.DocTypeID.Equals(DocTypeID)
                                           select dt;
            List<DocumentType> l = new List<DocumentType>(ie);
            if (l.Count == 0)
                return null;
            return l[0];
        }

        /*
         * Удаляет тип документа из БД затем из коллекции
         * Параметры:
         *      (docTypeID) ID типа документа
         */
        public void DeleteDocType(SqlInt32 DocTypeID)
        {
            DocumentType foundDT = SearchDocType(DocTypeID);
            foundDT.Delete();
            docTypes.Remove(foundDT);
        }

        /*
         * Обновляет тип документа в коллекции затем в БД
         * Параметры:
         *      (docTypeID) ID типа документа
         *      (Name) новое наименование
         *      (DayToPerform) новое кол-во дней на исполнение
         *      (DayToAlarm) новое кол-во дней до предупреждения
         */
        public void UpdateDocType(SqlInt32 DocTypeID, SqlString Name, SqlInt32 DayToPerform, SqlInt32 DayToAlarm)
        {
            DocumentType foundDT = SearchDocType(DocTypeID);
            foundDT.Name = Name;
            foundDT.DayToPerform = DayToPerform;
            foundDT.DayToAlarm = DayToAlarm;
            foundDT.Update();
        }

        /*
         * Добавляет новый тип документа в БД затем в коллекцию
         * Параметры:
         *      (Name) Наименование типа документа
         *      (DayToPerfrom) Дней на исполнение документа
         *      (DayToAlarm) Дней до предупреждения
         */
        public void InsertDocType(SqlString Name, SqlInt32 DayToPerform, SqlInt32 DayToAlarm)
        {
            DocumentType newDocType = new DocumentType(Name, DayToPerform, DayToAlarm);
            newDocType.Insert();
            docTypes.Add(newDocType); 
        }

    }
}



Приложение пока что работает только с таблицей типов документов, но работа с самими документами я думаю будет аналогичной.
При запуске приложения и создании главной формы создается объект DocTypeCollection и загружает в себя все данные которые есть, далее по формам ходит только ссылка на объект DocTypeCollection и дергает методы !!!мне кажется это узким местом программы, потому что если второй пользователь запустит еще одни экземпляр приложения и будет редактировать типы документов, первый пользователь не увидит изменений т.к. загружает все типы документов лишь при создании приложения и хранит их в ОЗУ

Если у вас будет время вникнуть в суть моей писанины и высказать мнение я буду признателен. Отвечу на любой вопрос заинтересовавшихся если что-то не расписал.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38570915
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sadata,
задача как понимаю в учебных целях, ИМХО я бы:
1. использовал какой-нить ORM с поддержкой Linq, partial классы, при необходимости добавлял специфичные методы
2. DataTable - не то что устарел, но уже давно от него и всяких .Fill() с радостью убежали. К таблицам отлично биндятся списки полученные из Linq запросов или просто списки.
3. разделять модель данных и модель формы
4. Настройки лучше хранить в родном App.config либо реестре, раньше усиленно пилили свои XML с настройками лежащий возле EXE, и как попался продвинутый админ сети (у которого пользователи не имеют административных полномочий на компе) - получилась большая папа, у такой программы нет прав читать/писать в ProgramFiles. а App.config пишет в допустимые и предусмотренные для этого места.
5. В виду вышеуказанной сложности, базу FB расположил бы в c:\ProgramData\MyProg, погуглите на тему "где виндовс приложение должно хранить данные и настройки, по феншую"
6. Инсталлер программе делали? )))
7. Как "начинающий" - не бойтесь "оверинженеринга", пробуйте варианты разные, по другому не научиться. На то они и лабы. Сразу сделать "идеально" редко получается, мне кажется даже у гуру программы претерпевают несколько "итераций".
...
Рейтинг: 0 / 0
Архитектура приложения
    #38570919
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sadata,

В принципе, все правильно, только мелочи:
,F_DAY_TO_PERFORM - не надо префикс в имени столбца. И так ясно что это будет.


BindingINI - не нужен, надо использовать app.config. Там все тоже самое, что пишете вы.

любой нестандарт - плохо.

Проблема синхронизации данных в базе - это несколько за уровнем лабораторной работы.
Делать надо только если оно того стоит. А то ведь вы еще забыли про пользователей и привелегии...
:-)

Счас, вам насоветуют....
...
Рейтинг: 0 / 0
Архитектура приложения
    #38570922
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sadataПри запуске приложения и создании главной формы создается объект DocTypeCollection и загружает в себя все данные которые есть, далее по формам ходит только ссылка на объект DocTypeCollection и дергает методы !!!мне кажется это узким местом программы...
Не нужны все данные.
Пользователь "бродит" по списку документов (несколько полей) в гриде.
И только при редактировании грузите в память нужные документ, после его сохраняете в БД.
По таймеру обновляете грид чтоб подтягивать изменения.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38571097
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sadata Тут пример с исходниками простой трёх-звенной информационной системы "от и до" в архитектуре EF -> WCF -> WPF. Может поможет...
...
Рейтинг: 0 / 0
Архитектура приложения
    #38572021
sadata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
D129,
D129Проблема синхронизации данных в базе - это несколько за уровнем лабораторной работы.
Делать надо только если оно того стоит. А то ведь вы еще забыли про пользователей и привелегии...

Это не совсем лаба, это скорее преддипломная практика. Мне просто на "предприятии" сказали свою хотелку. Да, требований по привилегиям нет, и ходить они будут под dba ролью, но во мне живет маленький перфекционист, и цель больше не удовлетворить заказчика, а удовлетворить себя. Ведь через месяца 2-3 мне искать работу, а при поиске просят показать пример кода. Насколько моя задача подойдет как пример я не знаю, но все таки)
Поэтому синхронизация важна, необходимо реализовать ее правильно. Есть локальная сеть и "сервер" (компьютер в картотеке который не выключают). Сейчас думаю что нибудь в сторону трехзвенки которую предложил Алексей К, посмотрю как реализовано по его ссылке.
Я не уверен в правильности использования таймера как предложил Кифирчик... мы же не можем обновлять каждые 10 секунд, а если делать дольше, то шанс пропустить какую либо транзакцию резко увеличивается и данные будут не актуальны.

ЗЫ инсталлер буду пробовать делать, но пока это не критичный момент)

Спасибо за наводку про app config, устаревший datatable и за ссылку на реальный проект в исходниках)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38572039
sadata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще дополню, может изначально не правильно расписал

Тип документа будет содержать такую инфу: Название - "Жалоба", До исполнения 7 дней, До предупреждения 4 дня
Потом когда мы создаем сам документ, в главном окне выбираем "Вид документа" (вверху панели). В лист боксе будут наименования документов, у каждого какой либо тип.
Будут генерироваться отчеты на конкретную дату, например какие документы должны быть исполнены срочно
Если документ создан 01.01.2014 и тип документа у него "Жалоба" то необходимо его исполнить до 08.01.2014. Пользователь генерит отчет допустим на 05.01.2014 и ему формируется xls в котором горит эта жалоба и ему необходимо ее срочно исполнить, иначе ему напинают.
Что-то типо того)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38572173
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sadataЭто не совсем лаба, это скорее преддипломная практика.

Трех-звенка это стандартное решение, но несколько "из пушки по воробьям" - для хранения документации...

Можно сделать синхронизацию и в базе данных -
например, при открытии документа на редактирование - помечать его (отдельный столбец - типа кто взял)
И в конце редактирования (при сохранении изменений) - отдавать.
Можно при этом заморочиться транзакцией - но можно и без
Чисто статистически - это будет экстремально редкая ситуация, если одновременно два человека начнут редактировать документ.
Правда, возникнут сопутствующие проблемы, но это всегда так если накручиваешь защиты и предохранители.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38572176
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sadataДо исполнения 7 дней, До предупреждения 4 дня


Это трехзвенка. Кто-то должен все время висеть в памяти и отсчитывать эти дни и выписывать люлей.
:-)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38572423
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кифирчик...2. DataTable - не то что устарел, но уже давно от него и всяких .Fill() с радостью убежали. К таблицам отлично биндятся списки полученные из Linq запросов или просто списки.
...Эвон как... А то что DataTable это и есть по сути своей список, ничего? Ну да, теперь тынденция извратиться и использовать всякие нахлобучки в виде LINQ, для студента, без понимания глубинных процессов этого самого LINQ, ну-ну...

Для начала нужно понимать ЧТО и КАК происходит на самом деле. А потом уже использовать те или иные вещи.
В конечном итоге LINQ - лишь синтетический сахар, который выполнит то-же самое что и Fill для DataTable, вот только на Fill можно изнутри прямо в исходнике посмотреть, а для LINQ нужно будет ILDASM-мом по сборке пройтись, чтобы увидеть...

SADATA - в запросах используйте параметры, а не динамическое построение тела запроса, если уж не хотите заморачиваться с хранимыми процедурами...
По поводу макета главного окна - слишком много рамок, "глаза режет". "Отметка об исполнении" - это что? Т.е. жмакнул по переключателю, значит исполнено? Может лучше сделать выпадающий список с определёнными статусами, позволяющими проследить стадии исполнения и т.д.?
Поле краткое содержание лучше сделать пошире, потому как читать текст, который форматирован "столбиком" крайне неудобно, особенно если краткое содержание вовсе не краткое.
Результаты рассмотрения - обычно результаты рассмотрения имеют конечный набор: "Принят", "Отклонён", "В работу" и т.д., Рассмотрите возможность создания списка результатов и его использования. Писать каждый раз одно и то-же не комильфо.

По поводу архитектуры решения: ежели количество пользователей небольшое, и "сервер" вовсе даже и не сервер, а так, клиентская машинка, то замарачиваться в рисованием трёхзвенки особого смысла нет. Проще тригером писать в отдельную таблицу время последних изменений таблиц, которые желательно отслеживать. А в программе отдельным потоком проверять эту таблицу на предмет изменения времени и соответственно в случае необходимости вызывать событие, по которому произойдёт считывание нужных данных. Кстати, в трёхзвенной архитектуре точно также нужно будет продумывать систему уведомлений об изменениях, и опять-же делать это придётся в отдельном потоке.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38572481
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovКифирчик...2. DataTable - не то что устарел, но уже давно от него и всяких .Fill() с радостью убежали. К таблицам отлично биндятся списки полученные из Linq запросов или просто списки.
...Эвон как... А то что DataTable это и есть по сути своей список, ничего? Ну да, теперь тынденция извратиться и использовать всякие нахлобучки в виде LINQ, для студента, без понимания глубинных процессов этого самого LINQ, ну-ну...

Для начала нужно понимать ЧТО и КАК происходит на самом деле. А потом уже использовать те или иные вещи.
В конечном итоге LINQ - лишь синтетический сахар, который выполнит то-же самое что и Fill для DataTable, вот только на Fill можно изнутри прямо в исходнике посмотреть, а для LINQ нужно будет ILDASM-мом по сборке пройтись, чтобы увидеть...
1. Ну вот я сперва DataTable во всю использовал, потом наплевавшись (в частности с мержингом кастомной модели в SVN) подумал что будет круто, и старательно пилил свои классы в связке с SqlCommand/SqlDataReader, рефлекшн по полной, тщательно вел поверх этого WCF со своими методами доступа, потом добрался до ORM с поддержкой Linq, и все что раньше кодил неделями, сделал за 3 дня кастомизацией кодогенератора (Т4), при этом количество объектов в самой БД уменьшилось в трое, и при смене модели БД не нужно по несколько файлов исправлять ручками.
А новенькому коллеге, считай после вуза, абсолютно не составило труда юзать ORM+WCF+LINQ не имея дико глубоких познаний в том как это работает. Выводы, рядом подсказать было некому, грабли личные, и недели рабочего времени потрачены в пустую, рутиной.

2. используя linq всегда можно посмотреть какой он sql запрос генерирует, как правило этого более чем достаточно.

3. DataTable/CustomDataSet... ноу комментс. Спросил сейчас коллег, не скучают ли, все улыбнулись (ИМХО). Если вас устраивает эта "обертка", либо в проекте так исторически сложилось - ваше право. В .NET как правило есть несколько путей для решения задачи, каждый выбирает то что считает правильным.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38572628
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кифирчики все что раньше кодил неделями, сделал за 3 дня... при этом количество объектов в самой БД уменьшилось в трое...Ахаха, инструмент спроектировал БД быстрее и качественнее, чем разработчик. И последний этим ещё и гордится. Стыдоба!
...
Рейтинг: 0 / 0
Архитектура приложения
    #38572672
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAКифирчики все что раньше кодил неделями, сделал за 3 дня... при этом количество объектов в самой БД уменьшилось в трое...Ахаха, инструмент спроектировал БД быстрее и качественнее, чем разработчик. И последний этим ещё и гордится. Стыдоба!
Какую-то фигню написали. Гексли какой-то.
1. "Инструмент" не проектирует базу, не знаю как там у вас такое получается. "Инструмент" на основе базы данных создал "обертку" классов над таблицами БД. Вы разницу ощущаете?
2. Да, к примеру раньше в БД существовала хранимка реализующая пэйджинг, с появлением линка её необходимость отпала. Объектов в БД стало меньше. Часть логики перекочевала в Linq, несколько изменился подход работы с базой.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38572674
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кифирчик...А новенькому коллеге, считай после вуза, абсолютно не составило труда юзать ORM+WCF+LINQ не имея дико глубоких познаний в том как это работает. ... Вы знаете, многим домохозяйкам абсолютно не составляет труда "юзать" автомобили, абсолютно не представляя себе как оно всё там внутри работает, пусть даже и поверхностно. НО, программист не домохозяйка, он обязан понимать, что и как работает в продукте, который он разрабатывает, а уж про используемые технологии и подавно...
"Скажу Вам по секрету", за последние много-много лет ничего принципиально нового в подходе к работе с серверными базами данных не изменилось и не произошло, все также как и прежде: запрос от клиента, выборка данных сервером, получение данных клиентом, "прохождение" по полученному набору данных и их обработка. IMHO изменились лишь обёртки, появились фантики для тех кто хочет "побыстрей" накодить...
Кифирчик... В .NET как правило есть несколько путей для решения задачи, каждый выбирает то что считает правильным.Согласен, кому поп, кому попадья, а кому попова дочка...

Засим считаю сей спор безсмысленным ...
...
Рейтинг: 0 / 0
Архитектура приложения
    #38572716
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КифирчикskyANAпропущено...
Ахаха, инструмент спроектировал БД быстрее и качественнее, чем разработчик. И последний этим ещё и гордится. Стыдоба!
Какую-то фигню написали. Гексли какой-то.
1. "Инструмент" не проектирует базу, не знаю как там у вас такое получается. "Инструмент" на основе базы данных создал "обертку" классов над таблицами БД. Вы разницу ощущаете?Типа, дизайнер датасетов такого не умеет... Аха...
БЕЗ использования "кодогенератора по шаблонам"... И точно не "за три дня" стучания пальцами по клавиатуре, а всего за несколько минут кликания мышкой...
И на ВЫХОДЕ - ОЧЕНЬ СТРОГО типизированные (и даже расширяемые) классы...
Кифирчик2. Да, к примеру раньше в БД существовала хранимка реализующая пэйджинг, с появлением линка её необходимость отпала. Объектов в БД стало меньше. Часть логики перекочевала в Linq, несколько изменился подход работы с базой.Можно подумать, что количество объектов базы данных хоть как-то влияет на сложность поекта... Как минимум, коммутативность от простого переноса функционала из одного места (из базы) в другое (в приложение)...
И шож за проЭкт, в котором удаление одной хранимой процедуры для пэйджинга уменьшает количество "объектов в базе данных в три раза"? 8-0
...
Рейтинг: 0 / 0
Архитектура приложения
    #38572766
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mv, чтож все такие фанаты датасетов...
Проект создавался в бородатые времена .NET 2, я еще "под стол пешком ходил". На каждую таблицу была своя ХП Select/Insert/UPdate/Delete, и связанные с ними SqlCommand, и все это с датасетами настроенное и связанное через визуальный редактор.
По мне такая схема явно "не прозрачная", было тяжко все это отлаживать, постоянные проблемы с дизайнером и в виду пересоздания модели.
Тут видимо все сразу стали профи и все умели, и ни про один свой старый проект не могут сказать "я в виду не знания использовал не самый лучший вариант"?
У меня к сожалению такое бывает, и не зная всяких T4, Linq2Sql, EF и прочего стал делать свои классы, методы для них через SqlCommand, DataSet, ручками делал соответствующий WCF сервер, очень познавательно, но довольно трудоемко.

Вот как узнаю что-то новое, по возможности стараюсь исправить свой старый код.

И кодегенератор пилился не для того чтоб сделать тоже самое что делает дизайнер датасетов, это в любом ORM за пару минут делается, а чтоб автоматом генерились всякие enum связанные с таблицами, модели форм и прочие удобства. В пару кликов уложиться не удалось.

По мне сложные ХП в БД лучше реализовать на Linq, как минимум проще отладить C# код чем код в ХП, более читабильно выходит, + пэйджинг, +простейшие выборки - это все переписал на Linq. Чем вас удивляет что в БД и шарпе стало меньше объектов между которыми нужно ловить проблемы?

По мне все стало более "структурировано" и это много проще сопровождать.

какие еще подъе# будут?
...
Рейтинг: 0 / 0
Архитектура приложения
    #38572790
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
КифирчикПо мне сложные ХП в БД
Надеюсь что в данном случае Вы имели ввиду все же бизнес-логику
...
Рейтинг: 0 / 0
Архитектура приложения
    #38572797
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2КифирчикПо мне сложные ХП в БД
Надеюсь что в данном случае Вы имели ввиду все же бизнес-логику
Да, хп в которых много действий и условий, основная бизнес-логика приложения.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38572809
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кифирчикsphinx_mv, чтож все такие фанаты датасетов...
Проект создавался в бородатые времена .NET 2, я еще "под стол пешком ходил". На каждую таблицу была своя ХП Select/Insert/UPdate/Delete, и связанные с ними SqlCommand, и все это с датасетами настроенное и связанное через визуальный редактор.
По мне такая схема явно "не прозрачная", было тяжко все это отлаживать, постоянные проблемы с дизайнером и в виду пересоздания модели.
Тут видимо все сразу стали профи и все умели, и ни про один свой старый проект не могут сказать "я в виду не знания использовал не самый лучший вариант"?
У меня к сожалению такое бывает, и не зная всяких T4, Linq2Sql, EF и прочего стал делать свои классы, методы для них через SqlCommand, DataSet, ручками делал соответствующий WCF сервер, очень познавательно, но довольно трудоемко.

Вот как узнаю что-то новое, по возможности стараюсь исправить свой старый код.

И кодегенератор пилился не для того чтоб сделать тоже самое что делает дизайнер датасетов, это в любом ORM за пару минут делается, а чтоб автоматом генерились всякие enum связанные с таблицами, модели форм и прочие удобства. В пару кликов уложиться не удалось.

По мне сложные ХП в БД лучше реализовать на Linq, как минимум проще отладить C# код чем код в ХП, более читабильно выходит, + пэйджинг, +простейшие выборки - это все переписал на Linq. Чем вас удивляет что в БД и шарпе стало меньше объектов между которыми нужно ловить проблемы?

По мне все стало более "структурировано" и это много проще сопровождать.

какие еще подъе# будут?Фишка в том, что всякие T4, Linq2Sql, EF не содержат в себе какой-то чудесный код и не реализуют какие-то магические подходы и не обязательно было ждать их появления, чтобы переписать свой бородатый проект.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38572826
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAФишка в том, что всякие T4, Linq2Sql, EF не содержат в себе какой-то чудесный код и не реализуют какие-то магические подходы и не обязательно было ждать их появления, чтобы переписать свой бородатый проект.
Верно! чудес и магии там нет. Но чтоб переписать бородатый проект и не пилить свои велосипеды нужно сперва начать работать там где есть этот бородатый проект и "знать" что есть T4, Linq2Sql, EF, и иметь хотяб небольшой опыт их применения.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38572833
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КифирчикskyANAФишка в том, что всякие T4, Linq2Sql, EF не содержат в себе какой-то чудесный код и не реализуют какие-то магические подходы и не обязательно было ждать их появления, чтобы переписать свой бородатый проект.
Верно! чудес и магии там нет.И в чём тогда проблема с тем, чтобы разобраться с тем "ЧТО и КАК происходит на самом деле"?
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573124
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кифирчикsphinx_mv, чтож все такие фанаты датасетов...Потому что DataSet - самодостаточный и полностью совместим с ЛЮБЫМИ версиями фреймворка.
КифирчикПроект создавался в бородатые времена .NET 2, я еще "под стол пешком ходил". На каждую таблицу была своя ХП Select/Insert/UPdate/Delete, и связанные с ними SqlCommand, и все это с датасетами настроенное и связанное через визуальный редактор.
По мне такая схема явно "не прозрачная", было тяжко все это отлаживать, постоянные проблемы с дизайнером и в виду пересоздания модели.(всплеснул руками) Да, что Вы такого говорите?!
Можно подумать, что пересоздание модели при использовании "других" средств не сущестует в природе - вот просто так и хочется верить... Ага...
И, кстати, в чем (если не секрет) заключаются "проблемы с дизайнером" DataSet'а?
Ну, я "в принципе", знаю о проблемах в дизайнере датасета при использовании одного конкретного сервера баз данных, но тут Вы явно подразумеваете нечто более "глобальное"...
КифирчикТут видимо все сразу стали профи и все умели, и ни про один свой старый проект не могут сказать "я в виду не знания использовал не самый лучший вариант"?
У меня к сожалению такое бывает, и не зная всяких T4, Linq2Sql, EF и прочего стал делать свои классы, методы для них через SqlCommand, DataSet, ручками делал соответствующий WCF сервер, очень познавательно, но довольно трудоемко.Незнание стандартных средств разработки - не повод для гордости... Вообще!..
КифирчикВот как узнаю что-то новое, по возможности стараюсь исправить свой старый код.

И кодегенератор пилился не для того чтоб сделать тоже самое что делает дизайнер датасетов, это в любом ORM за пару минут делается, а чтоб автоматом генерились всякие enum связанные с таблицами, модели форм и прочие удобства. В пару кликов уложиться не удалось.Да, нет там никаких принципиальных "удобств"... Точнее, они есть, но "во дворе"...
КифирчикПо мне сложные ХП в БД лучше реализовать на Linq, как минимум проще отладить C# код чем код в ХП, более читабильно выходит,Улыбнуло... :)
Вы в курсе, что действительно сложная хранимая процедура "немножко больше", чем банальный запрос к данным - максимум, которым Вы можете похвастаться при использовании LINQ...
Кифирчик + пэйджинг, +простейшие выборки - это все переписал на Linq. Чем вас удивляет что в БД и шарпе стало меньше объектов между которыми нужно ловить проблемы?Идеальный, безглючный код - код, котрый не написан.
Ну, а то, что в результате этого перехода Вы огребли добавили кучу зависимого от других нестандартных компонентов кода, который Вам надо связать, написать, отладить и тестировать, а потом отдельно (и дополнительно) сопровождать, совсем не сделало Ваш "проект" менее сложным и более безглючным...
КифирчикПо мне все стало более "структурировано" и это много проще сопровождать.Ну-ну...
Порадовало про "проще сопровождать"... Особенно - когда выйдет новая версия используемого Вами ORM-фреймворка...
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573137
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mv,

людям нравится назвать табличку в БД Классом:), чувствуют себя прогерами сразу (ООП орентируетесь? аякж!, вон тъма классов для телефонного справочника)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573642
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvКифирчикТут видимо все сразу стали профи и все умели, и ни про один свой старый проект не могут сказать "я в виду не знания использовал не самый лучший вариант"? ...Незнание стандартных средств разработки - не повод для гордости... Вообще!..
Протрите очки, где я писал что горжусь этим!? я наоборот писал что не знал, делал глупости и сожалею о потраченном времени.

sphinx_mvПотому что DataSet - самодостаточный и полностью совместим с ЛЮБЫМИ версиями фреймворка.
я высказал свое сугубо личное мнение по поводу датасетов, не пойму что Вы так всбеленились. мне комфортнее не с TypedDataSet . db over wcf в комплекте нравится (хотя предположу что и для TypedDataSet мелкософт что-то подобное придумал), и то что можно не юзать визуального дизайнера и подпилить для себя T4 - тоже нравится, с фреймворками проблем не будет, и в принципе на другой ORM спрыгнуть при необходимости можно.
Кому-то нравятся тойоты, кто-то фанат БМВ.
Вам нравятся типированные датасеты, да пожалуйста, я за Вас рад. Могли бы просто озвучить их плюсы в сравнении с тем же EF, топик стартеру было бы от этого больше пользы.
Собственно и к typed dataset можно linq запросы делать.
У меня был вариант Typed DataSet + дизайнер + куча однотипных хранимок в БД.
вариант с wcf context, Т4 и минимумом ХП мне понравился больше.
Озвучьте свой феншуйный рецепт.

sphinx_mvКифирчик...По мне такая схема явно "не прозрачная", было тяжко все это отлаживать, постоянные проблемы с дизайнером и в виду пересоздания модели.(всплеснул руками) Да, что Вы такого говорите?!
Можно подумать, что пересоздание модели при использовании "других" средств не сущестует в природе - вот просто так и хочется верить... Ага...
И, кстати, в чем (если не секрет) заключаются "проблемы с дизайнером" DataSet'а?
Не сомневаюсь что Вы знаете тип.датасеты лучше меня, и знаете как обойти все сложности, но обсуждать это в форме "всплесков руками" и стеба не интересно.

sphinx_mvКифирчикПо мне сложные ХП в БД лучше реализовать на Linq, как минимум проще отладить C# код чем код в ХП, более читабильно выходит,Улыбнуло... :)
Вы в курсе, что действительно сложная хранимая процедура "немножко больше", чем банальный запрос к данным - максимум, которым Вы можете похвастаться при использовании LINQ...
Даааа..а.. а я то и не знал!!! Х)
"Сложные процедуры" которые я перенес в линк были в Вашей классификации не " действительно сложными " и содержали не "немножко больше чем банальные запросы" а много условий, проверок данных, и вызовов друг друга. ~400 строк в T-SQL ИМХО это жесть, особенно отладка. Допускаю что у Вас будет отличное мнение.
sphinx_mvИдеальный, безглючный код - код, котрый не написан.
Ну, а то, что в результате этого перехода Вы огребли добавили кучу зависимого от других нестандартных компонентов кода, который Вам надо связать, написать, отладить и тестировать, а потом отдельно (и дополнительно) сопровождать, совсем не сделало Ваш "проект" менее сложным и более безглючным...
Не пойму откуда Вы все это берете. Завидую телепатической способности по сообщениям в форуме оценить проект и определить чегож я там отгреб.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573677
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кифирчикмне комфортнее не с TypedDataSet . db over wcf в комплекте нравится (хотя предположу что и для TypedDataSet мелкософт что-то подобное придумал), и то что можно не юзать визуального дизайнера и подпилить для себя T4 - тоже нравится, с фреймворками проблем не будет, и в принципе на другой ORM спрыгнуть при необходимости можно .Мечты... Мечты...
А пока "спрыгивать" будете и придется зоопарк из разных фреймворков поддерживать...
В извращениях нужно знать толк.
КифирчикКому-то нравятся тойоты, кто-то фанат БМВ.
Вам нравятся типированные датасеты, да пожалуйста, я за Вас рад. Могли бы просто озвучить их плюсы в сравнении с тем же EF, топик стартеру было бы от этого больше пользы.Самый главный плюс - ЗНАТЬ как это работает на самом деле...
КифирчикСобственно и к typed dataset можно linq запросы делать.И что из этого следует? Сначала выполняем запрос к базе данных, чтобы заполнить датасет, а потом по получившемуся набору эмулируем другой запрос, но уже на LINQ?! Я ничего не упустил?
Теперь это называется "эффективной разработкой"?! Про "эффективные приложения", отмечу, я даже не упоминал...
Банальные сортировки, фильтрация и поиска в данных - и это практически все, что умеет LINQ.
Самой прикольное, что все это можно делать совсем без использования LINQ - и со времен царя гороха.
КифирчикУ меня был вариант Typed DataSet + дизайнер + куча однотипных хранимок в БД.
вариант с wcf context, Т4 и минимумом ХП мне понравился больше.
Озвучьте свой феншуйный рецепт.Фэншуй заключается в том, чтобы знать и уметь пользоваться инструментом - Вы про такой подход в курсе?
Кифирчикsphinx_mv(всплеснул руками) Да, что Вы такого говорите?!
Можно подумать, что пересоздание модели при использовании "других" средств не сущестует в природе - вот просто так и хочется верить... Ага...
И, кстати, в чем (если не секрет) заключаются "проблемы с дизайнером" DataSet'а?Не сомневаюсь что Вы знаете тип.датасеты лучше меня, и знаете как обойти все сложности, но обсуждать это в форме "всплесков руками" и стеба не интересно.Вам задали прямой вопрос о проблемах с дизайнером датасетов, на которые указали именно Вы... Ответ будет?
И Вы что-то намекали про отсутствие необходимости пересоздания модели для не-датасета...
Кифирчикsphinx_mvУлыбнуло... :)
Вы в курсе, что действительно сложная хранимая процедура "немножко больше", чем банальный запрос к данным - максимум, которым Вы можете похвастаться при использовании LINQ...
Даааа..а.. а я то и не знал!!! Х)
"Сложные процедуры" которые я перенес в линк были в Вашей классификации не " действительно сложными " и содержали не "немножко больше чем банальные запросы" а много условий, проверок данных, и вызовов друг друга.Ага... И после переноса на LINQ все это стало работать лучше...
Возможно, мне бы и захотелось в это ПОВЕРИТЬ, но, к сожалению, вот именно в этом вопросе я непробиваемо убежденный атеист. :)
Кифирчик~400 строк в T-SQL ИМХО это жесть, особенно отладка. Допускаю что у Вас будет отличное мнение.Конечно у меня будет отличное мнение: практически любое количество строк не-SQL-кода из T-SQL переводятся в идеальном случае в такое же количество строк на C#. И то, если ОЧЕНЬ повезет... Эффективного способа перевода SQL-запросов в C# нет.
И про "сложности отладки" хранимых процедур рассказывать не надо: слишком уж по-военному эти песни звучат - примерно, как сложности с дизайнером типизированного датасета...
Кифирчикsphinx_mvИдеальный, безглючный код - код, котрый не написан.
Ну, а то, что в результате этого перехода Вы огребли добавили кучу зависимого от других нестандартных компонентов кода, который Вам надо связать, написать, отладить и тестировать, а потом отдельно (и дополнительно) сопровождать, совсем не сделало Ваш "проект" менее сложным и более безглючным...
Не пойму откуда Вы все это берете. Завидую телепатической способности по сообщениям в форуме оценить проект и определить чегож я там отгреб.Не нужно быть телепатом, чтобы уметь оценивать последствия изменений в архитектуре приложения.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573691
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsov"Скажу Вам по секрету", за последние много-много лет ничего принципиально нового в подходе к работе с серверными базами данных не изменилось и не произошло
С реляционными базами данных. Потому как появились NoSQL базы, где приниципы работы несколько иные.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573695
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvЭффективного способа перевода SQL-запросов в C# нет."Рыба есть, ловить надо уметь". (ц)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573696
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кsphinx_mvЭффективного способа перевода SQL-запросов в C# нет."Рыба есть, ловить надо уметь". (ц)
Проходили же это уже в сраче ORM vs реляционка - по эквивалентности данных на выходе практически любой SQL всегда можно оттранслировать в C#. По оптимальности - отнюдь.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573700
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныАлексей Кпропущено...
"Рыба есть, ловить надо уметь". (ц)
Проходили же это уже в сраче ORM vs реляционка - по эквивалентности данных на выходе практически любой SQL всегда можно оттранслировать в C#. По оптимальности - отнюдь.LINQ сегодня уже неплохо транслируется в SQL. Планы выполнения сгенерированного SQL ничем не хуже рукописного. Так что с оптимальностью тут всё в порядке.

Нахреначить хранимых процедур - много ума не надо, это все умеют. А построить обработку данных на основе типизированных запросов, являющихся частью самого языка C# (и других), возможно, несколько сложнее. Но результат лучше.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573733
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КПланы выполнения сгенерированного SQL ничем не хуже рукописного.
Только если сгенерированный SQL прост. Или смаплен на существующие view/inline function. Как-то я сильно сомневаюсь, что ORM сможет C#-конструкцию оттранслировать в запрос с cross/outer apply, windowed/ranking funсtions, etc.
И как бы не стоит забывать о том, что оптимизатор может ошибаться, и статистика не всегда идеальна - из-за чего используется хинты.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573749
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvИ что из этого следует? Сначала выполняем запрос к базе данных, чтобы заполнить датасет, а потом по получившемуся набору эмулируем другой запрос, но уже на LINQ?! Я ничего не упустил?
Это к тому что мне не именно "линк" нравится, а ORM "полегче" чем TypedDataSet, не которая заливает к себе таблицы и сама следит за изменениями и контролирует констрейнты, а которая просто транслирует запросы в SQL.

sphinx_mvБанальные сортировки, фильтрация и поиска в данных - и это практически все, что умеет LINQ.
Самой прикольное, что все это можно делать совсем без использования LINQ - и со времен царя гороха.
Можно, но писать в духе
var cars1 = db.Cars.Where(c=>c.CarMake == "Ford").Select(c=>c.CarID);
на выходе я получу запрос "select CarID from dbo.Cars where CarMake = @p". (За сложными запросами наблюдал через профайлер, вполне адекватный SQL получается)
и это ИМХО удобнее чем .NET DB апи (времена царя гороха) использовать, следить чтоб с названиями опечаток не было, параметры в запросах и т.д.
с Linq - когда нужны "простые" запросы, ИМХО компактнее и читабильнее.

sphinx_mvФэншуй заключается в том, чтобы знать и уметь пользоваться инструментом - Вы про такой подход в курсе?
Окай, 2топик стартер. знать и использовать стандартные инструменты прежде чем изобретать велосипед или использовать в проекте сторонние поделки.

sphinx_mvИ Вы что-то намекали про отсутствие необходимости пересоздания модели для не-датасета...
Подзабывать уже стал... в дизайнере размещение элементов изменишь - пару раз нормально смержится в SVN, потом начинаются проблемы, и нужно пересоздавть модель с нуля, и по второму кругу расставлять на схеме, бегать по полям свойства менять. Таблички норовит целиком в себя затянуть, несколько вариантов Update, с констрейтами проблемы были, в итоге их просто удаляли.
Возможно это то того что я не знаю этот стандартный инструмент так хорошо как Вы, но вещи подобные перечисленным выше вызывали дискомфорт. Да и появился апп сервер, и клиенты напрямую с БД перестали работать. На тот момент информации как натянуть на это wcf не было.
С T4 все проще, проблем с мержингом не попадалось + куча всего "за огородом". Схемы мне достаточно в PD и его функций модификации БД.

sphinx_mvАга... И после переноса на LINQ все это стало работать лучше...
Возможно, мне бы и захотелось в это ПОВЕРИТЬ, но, к сожалению, вот именно в этом вопросе я непробиваемо убежденный атеист. :)
Нет, работать быстрее не стало, очевидно что какое-то время добавилось на трансляцию (порядок цифр - до 700мс, после 940мс).
Для пользователя это незаметно, таже транзакция, а с кодом стало проще работать и отлаживать. Банальная возможность пройтись дебаггером и использовать в коде #region сильно все упростили. Код выполняется в апп сервере, появилась возможность использовать не только данные базы. Раньше для каждого объекта пилилась своя ХП (своего рода кастомизация), и плыли по составу экземпляры БД, теперь свой XML с настройками логики, схема БД - на 99% унифицирована.
Нет у меня доменной авторизации к SQL чтоб использовать его отладчик, да и запускать хп из SMS и её отлаживать - менее удобно чем во время работы приложения.
С линк - время на борьбу с глюками уменьшилось в разы. Для меня это аргумент.
В Linq все перевелось практически 1 к 1. Именно "сложные запросы" - конечно же остались в ХП и вью.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573767
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныКак-то я сильно сомневаюсь, что ORM сможет C#-конструкцию оттранслировать в запрос с cross/outer applyВ это - запросто. См. трансляцию FirstOrDefault() во вложенном запросе в Entity Framework.
Сон Веры Павловныwindowed/ranking funсtions, etc.Этим не пользовался. Если что-то не получается - всегда можно написать вьюху. Но их будет мало.
Сон Веры ПавловныИ как бы не стоит забывать о том, что оптимизатор может ошибаться, и статистика не всегда идеальна - из-за чего используется хинты.Лучше видоизменить запрос или иметь актуальную статистику, чем использовать хинты.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573770
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КифирчикИменно "сложные запросы" - конечно же остались в ХП и вью.Любой сложный запрос делится на множество простых. Просто мысль... :-)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573773
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныТолько если сгенерированный SQL прост.Ну и опять же, сколько чего должно быть в SQL, чтобы он считался сложным? Нужна количественная оценка.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573811
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КСм. трансляцию FirstOrDefault() во вложенном запросе в Entity Framework.
Не получится - нет под рукой EF, у нас nHibernate используют. Так что просим самих.
Алексей КЛучше видоизменить запрос или иметь актуальную статистику, чем использовать хинты.
Видоизменять запрос при неверном выборе плана из-за неактуальной статистики в большинстве случаев смысла нет - например, для доступа к данным таблицы А используется предикат по полю В, оптимизатор считает, что тут нужен index scan по индексу С, и в упор не видит, что по индексу D будет index seek+RID lookup, которые дешевле, чем index scan. И тут хоть обвидоизменяйся - оптимизатор не переубедить, не пустив в дело хинт. Сталкиваюсь с таким достаточно часто.
Что же до актуализации статистики - она не всегда возможна. Например стороняя закрытая система, в которую можно лезть только своими запросами и dml. DDL - хорошо если на свой страх и риск. Однажды на моей памяти включение обновления статистики в базе такой системы эту систему просто положило. Почему - не знаю, но факт. Поэтому запрос в базе сбоку, подкрепленный хинтами - единственный выход.
Алексей КНу и опять же, сколько чего должно быть в SQL, чтобы он считался сложным? Нужна количественная оценка.
Оценивать сами конструкции языка здесь вряд ли разумно. А вот план исполнения - вполне можно. Например, такой (она на самом деле больше, чем на скриншоте - в полный размер просто в ограничение по размеру аттача не влез):
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573833
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныАлексей КСм. трансляцию FirstOrDefault() во вложенном запросе в Entity Framework.
Не получится - нет под рукой EF, у нас nHibernate используют. Так что просим самих.Уж поверьте на слово. :-)
Сон Веры ПавловныАлексей КЛучше видоизменить запрос или иметь актуальную статистику, чем использовать хинты.
Видоизменять запрос при неверном выборе плана из-за неактуальной статистики в большинстве случаев смысла нет - например, для доступа к данным таблицы А используется предикат по полю В, оптимизатор считает, что тут нужен index scan по индексу С, и в упор не видит, что по индексу D будет index seek+RID lookup, которые дешевле, чем index scan. И тут хоть обвидоизменяйся - оптимизатор не переубедить, не пустив в дело хинт. Сталкиваюсь с таким достаточно часто.
Что же до актуализации статистики - она не всегда возможна. Например стороняя закрытая система, в которую можно лезть только своими запросами и dml. DDL - хорошо если на свой страх и риск. Однажды на моей памяти включение обновления статистики в базе такой системы эту систему просто положило. Почему - не знаю, но факт. Поэтому запрос в базе сбоку, подкрепленный хинтами - единственный выход.Ну значит статистика такая. Например, записей в таблице мало.
Сон Веры ПавловныАлексей КНу и опять же, сколько чего должно быть в SQL, чтобы он считался сложным? Нужна количественная оценка.
Оценивать сами конструкции языка здесь вряд ли разумно. А вот план исполнения - вполне можно.Нет, нет, нет... не будем уходить в сторону. :-)

Все вокруг постоянно твердят о каком-то мифическом "сложном SQL". Хочу понять что это такое. Может в этот раз мне повезёт. :-)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573849
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К, вряд ли есть единый критерий, для каждого он будет свой, исходя из опыта и "политических" взглядов )
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573855
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КифирчикАлексей К, вряд ли есть единый критерий, для каждого он будет свой, исходя из опыта и "политических" взглядов )Я знаю. Поэтому меня всегда удивляет, когда кто-либо обосновывает невозможность чего-либо абстрактной сложностью чего-то там, в данном случае SQL. :-)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573904
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кифирчикисходя из опытаКакая правильная мысль :)

Предлагаю взять в руки интерфейс IQueryProvider и реализовать. Думаю "сложный SQL" быстро всплывёт после применения вашей реализации на реальных данных.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573969
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВсе вокруг постоянно твердят о каком-то мифическом "сложном SQL". Хочу понять что это такое. Может в этот раз мне повезёт. :-)
Ну, тогда вот так попробуйте: http://stackoverflow.com/questions/3353634/measuring-the-complexity-of-sql-statements
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573971
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныАлексей КВсе вокруг постоянно твердят о каком-то мифическом "сложном SQL". Хочу понять что это такое. Может в этот раз мне повезёт. :-)
Ну, тогда вот так попробуйте: http://stackoverflow.com/questions/3353634/measuring-the-complexity-of-sql-statements
ОттудаSomething like:

•number of tables times (1
•+1 per join expression (+1 per outer join?)
•+1 per predicate after WHERE or HAVING
•+1 per GROUP BY expression
•+1 per UNION or INTERSECT
•+1 per function call
•+1 per CASE expression
И при каком количестве набранных очков применение LINQ-to-SQL становится невозможным? :-)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573991
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КИ при каком количестве набранных очков применение LINQ-to-SQL становится невозможным? :-)
А тут кто-то говорил о невозможности? Речь выше шла (отменя, по крайней мере) о проигрыше в оптимальности.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574008
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныАлексей КИ при каком количестве набранных очков применение LINQ-to-SQL становится невозможным? :-)
А тут кто-то говорил о невозможности? Речь выше шла (отменя, по крайней мере) о проигрыше в оптимальности.Ну пусть не "невозможность", а "проигрыш в оптимальности". При достижении определённой сложности в сгенерированных SQL-запросах лавинообразно увеличится количество чтений? Жуть... :-)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574012
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне вот, например, приятно в "сложных запросах" пользоваться ассоциациями и code-complete вместо ручного написания join-ов. Я экономлю на этом массу времени и нервов. Таки сложные SQL-запросы лучше генерировать, а не писать вручную?
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574027
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны, с Алексеем нет смысла спорить.

Конкретно в его проекте, с его структурой БД, и его запросами нет никаких проблем.
Значит и у остальных их не может быть. Проходили уже :)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574028
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КПри достижении определённой сложности в сгенерированных SQL-запросах лавинообразно увеличится количество чтений? Жуть... :-)
Не жуть, но факт - не раз было проверено профайлером. В ряде случаев на это можно забить, в ряде такие сложности приходится выносить во вьюху/функцию, и маппить на них - потому как либо пользователи раздражаются на излишнее ожидание, либо админы на излишнее отжирание ресурсов.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574057
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныАлексей КПри достижении определённой сложности в сгенерированных SQL-запросах лавинообразно увеличится количество чтений? Жуть... :-)
Не жуть, но факт - не раз было проверено профайлером.Вы же не работаете с EF, откуда Вам знать? :-)

EF и NH не совсем не одно и то же.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574095
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кsphinx_mv Эффективного способа перевода SQL-запросов в C# нет."Рыба есть, ловить надо уметь". (ц)"Тут рыбы нет!" (ц) директор стадиона.
Обратите ЕЩЕ раз внимание на выделенное... То, что LINQ не в полной мере даже просто покрывает функционал "стандартного" SQL - это плохо опровергаемый факт.

И не забудьте, что когда Вы таки используете LINQ-то-"какая-то СУБД/ORM/etc." Вы все-таки транслируете не SQL в LINQ, а LINQ в SQL - что есть "немножко разное"...

При этом я пока еще не предлагаю принять во внимание эффективность получения результатов для LINQ-запросов ии "конечных" SQL-запросов к базе данных. Ну, хотя бы потому, что иначе как минимум для SQL-запросов придется вспомнить, что на разных серверах БД "эффективный" синтаксис SQL-запросов тоже разный...
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574098
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей ККифирчикИменно "сложные запросы" - конечно же остались в ХП и вью.Любой сложный запрос делится на множество простых. Просто мысль... :-)Ну-ну... Как это "по-нашему" - сначала создаем себе проблемы, потом героически их преодолеваем...
Тянем на клиента практически "сырые" данные, а потом их "сливаем" между собой - это, ну, ОЧЕНЬ практично... Даже для выборок из таблиц на пару сотен тысяч записей... А потом начинаем жаловаться, что сервер БД захлебывается от запросов, что сеть слабая, что памяти не хватает и т.д. и т.п...
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574099
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кифирчикsphinx_mvБанальные сортировки, фильтрация и поиска в данных - и это практически все, что умеет LINQ.
Самой прикольное, что все это можно делать совсем без использования LINQ - и со времен царя гороха.
Можно, но писать в духе
var cars1 = db.Cars.Where(c=>c.CarMake == "Ford").Select(c=>c.CarID);
на выходе я получу запрос "select CarID from dbo.Cars where CarMake = @p". (За сложными запросами наблюдал через профайлер, вполне адекватный SQL получается)Соединять таблицы (join)? Выбирать связанные по "мастер-деталь"? "Не верю!" (с) :)
Кифирчики это ИМХО удобнее чем .NET DB апи (времена царя гороха) использовать, следить чтоб с названиями опечаток не было, параметры в запросах и т.д.Пфффф... :)
Не надо за названиями следить и за опечатками: интелисенс для баз данных существует тоже со времен царя гороха - включая переменные и параметры запросов и хранимых процедур с функциями.
Кифирчикс Linq - когда нужны "простые" запросы, ИМХО компактнее и читабильнее.Ну, скажем так... Очень зависит от степени кривизны рук архитекторов и разработчиков как приложения, так и ORM-фреймворка.

Как-то помогал разбираться с "непонятками" на сервере БД - десяток пользователей, доступ через WEB-интерфейс, жалкая сотня тысяч документов в базе (и постороннее коммерческое приложение).

Наблюдалось, что при выполнении некоторых выборок по условиям, введенными пользователями в приложении, сервер баз данных попадал в ступор - почти 100% загрузка по всем основным используемым ресурсам - процессор, диск, сеть... Начали разбираться с этим WTF'ом через профайлер - посто нужно было ткнуть сомневающихся носом во вполне ожидаемую ситуацию...
Чтобы выбрать данные по критерию, сначала формировался список данных из всех связанных таблиц: по общему списку документов список из множества атрибутов сначала дополнялся данными отдельными маленькими простыми запросами из базы. Потом по итоговому результату на WEB-сервере фильтрация по критериям. Иногда подобные "ну, очень легкие" обработки запускались несколькими пользователями параллельно. В итоге все это "счастье" начинало работать крайне медленно, и пользователи, не дождавшись результата, прерывали выполнение своих запросов... Но приложение на веб-сервере продолжало насиловать сервер баз данных. "Экстаз" сервера БД продолжался минут по 10-15 даже после отключения всех пользователей...

К чему это я? А к тому, что попасть в такую ситуацию при использовании даже "правильного" ORM-фреймворка проще пареной репы - даже для самых продвинутых разработчиков.
Кифирчикsphinx_mvФэншуй заключается в том, чтобы знать и уметь пользоваться инструментом - Вы про такой подход в курсе?
Окай, 2топик стартер. знать и использовать стандартные инструменты прежде чем изобретать велосипед или использовать в проекте сторонние поделки.
:)
Кифирчикsphinx_mvАга... И после переноса на LINQ все это стало работать лучше...
Возможно, мне бы и захотелось в это ПОВЕРИТЬ, но, к сожалению, вот именно в этом вопросе я непробиваемо убежденный атеист. :)
Нет, работать быстрее не стало, очевидно что какое-то время добавилось на трансляцию (порядок цифр - до 700мс, после 940мс).+30% времени на выполнение отдельнго запроса?! 8-0
С моими объемами транзакций в секунду меня просто уволят без выходного пособия после такой "оптимизации"...
КифирчикДля пользователя это незаметно, таже транзакция, а с кодом стало проще работать и отлаживать. Банальная возможность пройтись дебаггером и использовать в коде #region сильно все упростили.Скрывать блоки кода в хранимых процедурах, как ни странно, мне (как-то) удается без использования #region... :)
Про дебагер вроде бы уже было...
Про тестирование я упоминал? Если нет, то и оно доступно - как ручное, так и полностью автоматизированное.
КифирчикКод выполняется в апп сервере, появилась возможность использовать не только данные базы. Раньше для каждого объекта пилилась своя ХП (своего рода кастомизация), и плыли по составу экземпляры БД, теперь свой XML с настройками логики, схема БД - на 99% унифицирована.
Нет у меня доменной авторизации к SQL чтоб использовать его отладчикЭто какие-то ужасы из параллельной реальности...
Права правильно раздать разработчиков на отладочном сервере баз данных не вариант?
Кифирчикда и запускать хп из SMS и её отлаживать - менее удобно чем во время работы приложения.Относитесь к БД как к отдельному модулю, который может разрабатываться и отлаживаться отдельно от всех остальных.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574121
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvПолучается, что все кто скачал Entity Framework - лохи?
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574173
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvКифирчикпропущено...
Нет, работать быстрее не стало, очевидно что какое-то время добавилось на трансляцию (порядок цифр - до 700мс, после 940мс).+30% времени на выполнение отдельнго запроса?! 8-0
С моими объемами транзакций в секунду меня просто уволят без выходного пособия после такой "оптимизации"...
Ну так я не призываю Вас переходить на линк.
На моих объемах транзакций проблем нет, а вот соблюдение тучи условий и "нюансов", и сопровождение/доработки у нескольких заказчиков (хотелки у всех разные) - много более критичный момент. Лишние 300мс абсолютно не критичны в моей ситуации.
Все что дергается очень часто и сравнительно "сложно" (оперативные списки, отчеты) - отлично и очень быстро летает в T-SQL.
Для своей конкретной ситуации я выбрал такое вот распределение между Linq и T-SQL.

sphinx_mvПро тестирование я упоминал? Если нет, то и оно доступно - как ручное, так и полностью автоматизированное.
...Относитесь к БД как к отдельному модулю, который может разрабатываться и отлаживаться отдельно от всех остальных.
Да Вы кладезь новых знаний, надо где-то законспектировать.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574212
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кsphinx_mvПолучается, что все кто скачал Entity Framework - лохи?Это сколько? Один процент проектов на .Net? Пол?
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574261
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAЭто сколько?Это подозрительно много для ненужного проекта. Не забываем, что в .Net встроена одна из версий EF.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574270
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Получается, что все кто скачал Entity Framework - лохи?Это сколько? Один процент проектов на .Net? Пол? Все еще хуже: они даже меня посчитали... Несколько раз...
Ну, не всем ясно, что количество закачек не показывает картины реального использования...
Кто-то скачал, покрутил, не понравилось, плюнул и выкинул... А кто-то, скачал, описался кипятком и пихает его куда ни попадя...
При этом и те и другие тоже могут даже одну и ту же версию качать по нескольку раз...
В-общем доверия такой подобной статистике ровно на "ноль целых шишь десятых"...
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574286
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mv,

ну а я смотрю код
вдруг че удасться скопипиздить
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574305
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvПри этом и те и другие тоже могут даже одну и ту же версию качать по нескольку раз...
Кстати, да - учитывая, что EF ставится черкз Nuget, и плюсуя сюда командную разработку.
Я его качал как минимум несколько раз на работе, и один раз дома - когда знакомился с темой ORM.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574365
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAЭто сколько?Это подозрительно много для ненужного проекта. Не забываем, что в .Net встроена одна из версий EF.Frontpage Extensions CustomersWe know of 4,251,244 live websites using Frontpage Extensions in our records.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574733
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловныskiped...
С реляционными базами данных. Потому как появились NoSQL базы, где приниципы работы несколько иные.Дык про NoSQL базы тут вроде как речи не идёт.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574736
VladM2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для некоторых поделок с головой хватает что нить наподобие старенького http://www.toptensoftware.com/petapoco/ :)

зы
а "сложную работу" я лучше доверю серваку и грамотному pgsql, t sql (нужно подставить).
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574739
VladM2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а МСУ что в отпуске? :) он раньше "любил" такие топики
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574742
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К...Лучше видоизменить запрос или иметь актуальную статистику, чем использовать хинты.Хыыыы, вот прикол...
А предположим, что у Вас для таблицы, которая интенсивно используется в разных отчётах созданы соответствующие индексы.
Вы знаете, оптимизатор иногда таки не может корректно нарисовать план исполнения в силу его собственной статистики и тогда начитаются весёлые звездопляски с профайлером и прочим непотребством... А в это время тебе пользователи плешь проедают, потому как одно чудо запустило тяжеловесный отчёт, а другое не может в это время документы проводить, из-за того что тупо сервак в силу не оптимального запроса отдал ему ("отчётному" запросу)более чем дохрена ресурсов...
Вот тогда и приходится хинтами указать с какими индексами и в какой последовательности выбирать...
Сделаете это в LINQ+ORM - поставлю коньяк.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574897
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovАлексей К...Лучше видоизменить запрос или иметь актуальную статистику, чем использовать хинты.Хыыыы, вот прикол...
А предположим, что у Вас для таблицы, которая интенсивно используется в разных отчётах созданы соответствующие индексы.
Вы знаете, оптимизатор иногда таки не может корректно нарисовать план исполнения в силу его собственной статистики и тогда начитаются весёлые звездопляски с профайлером и прочим непотребством... А в это время тебе пользователи плешь проедают, потому как одно чудо запустило тяжеловесный отчёт, а другое не может в это время документы проводить, из-за того что тупо сервак в силу не оптимального запроса отдал ему ("отчётному" запросу)более чем дохрена ресурсов...
Вот тогда и приходится хинтами указать с какими индексами и в какой последовательности выбирать...
Сделаете это в LINQ+ORM - поставлю коньяк.Я понял Ваше сообщение так: "LINQ+ORM мне не нужны, у меня и без них всё достаточно плохо".
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574905
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К...Я понял Ваше сообщение так: "LINQ+ORM мне не нужны, у меня и без них всё достаточно плохо". Не обольщайтесь
Абсолютно неверно поняли...
Где я сказал, что у меня и так всё плохо и поэтому я не использую LINQ + ORM?
Передёргивать-то не надо...

Я лишь сказал, что используя LINQ+ORM у Вас не получится сделать тонкие настройки в сложных и интенсивных выборках. И если сможете это сделать, то я поставлю коньяк...

Видимо выпью коньяк сам

PS. Кстати, LINQ в .NET я действительно не использую т.к. нет в этом необходимости, а вот ORM по полной, и меня это как-то не особо напрягает (неиспользование LINQ в .NET), мне знаете-ли аналога LINQ в виде OPEN SQL в ABAP/4 более чем за глаза хватает. Только вот в OPEN SQL я в отличие от LINQ могу указать хинты в запросе... это чтобы не напряжно было серверу и пользователям...
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574913
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovГде я сказал, что у меня и так всё плохо и поэтому я не использую LINQ + ORM?Здесь:А предположим, что у Вас для таблицы, которая интенсивно используется в разных отчётах созданы соответствующие индексы.
Вы знаете, оптимизатор иногда таки не может корректно нарисовать план исполнения в силу его собственной статистики и тогда начитаются весёлые звездопляски с профайлером и прочим непотребством... А в это время тебе пользователи плешь проедают, потому как одно чудо запустило тяжеловесный отчёт, а другое не может в это время документы проводить, из-за того что тупо сервак в силу не оптимального запроса отдал ему ("отчётному" запросу)более чем дохрена ресурсов...
Вот тогда и приходится хинтами указать с какими индексами и в какой последовательности выбирать...
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574918
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кпропущено...Здесь:А предположим, что у Вас для таблицы, которая интенсивно используется в разных отчётах созданы соответствующие индексы.
Вы знаете, оптимизатор иногда таки не может корректно нарисовать план исполнения в силу его собственной статистики и тогда начитаются весёлые звездопляски с профайлером и прочим непотребством... А в это время тебе пользователи плешь проедают, потому как одно чудо запустило тяжеловесный отчёт, а другое не может в это время документы проводить, из-за того что тупо сервак в силу не оптимального запроса отдал ему ("отчётному" запросу)более чем дохрена ресурсов...
Вот тогда и приходится хинтами указать с какими индексами и в какой последовательности выбирать...Опять передёргивания и домыслы...
Хотите пользовать LINQ, используйте, кто-ж Вам запретит-то...
А мы уж так, по старинке, сами будем определять ЧТО и КАК должно исполняться на сервере, а не отдавать это на откуп "индусам", которые LINQ "срисовали"...

PS. Кстати, за попытки необоснованной "оптимизации скорости" выборки путём вытаскивания данных из связанных таблиц на "клиента" и последующего их "соединения" бью своих нещадно ложкой по лбу. Но к LINQ это ровным счётом никакого отношения не имеет, это можно устроить и без оного...
...
Рейтинг: 0 / 0
66 сообщений из 66, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Архитектура приложения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]