Ответы пользователя по тегу .NET
  • Как открыть файл ReadOnly?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Все очень просто.
    Path.Combine(client._WorkLogFileLoc, "dump.txt")
    просто строит путь, соединяя две части - часть пути из client._WorkLogFileLoc и "dump.txt".
    Для примера, пусть свойство client._WorkLogFileLoc содержит "D:\some\path\to\folder", в результате мы получаем
    Path.Combine("D:\some\path\to\folder", "dump.txt"), что даст:
    "D:\some\path\to\folder\dump.txt"
    Ответ написан
    Комментировать
  • Что выбрать для веб ado.net или entity framework?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Вот тут Когда используют низкоуровневый ADO.net, а когда Entity Framework?, мне кажется все разжевано.
    ADO.NET - низкоуровневая технология для обобщения доступа к данным.
    entity framework - ORM-библиотека для быстрого старта работы с данными. Быстрый старт и удобство работы != быстрой работе, вот в этом и состоит суть.

    Обычно делается микс, что-то обрабатывается посредством ORM, что-то на голых запросах + Dapper, к примеру.
    Ответ написан
    Комментировать
  • Как сделать маппинг хранимых процедур в Entity Framework?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Для выборки я бы посоветовал мапить на table-values functions, т.к. они при выборки оптимизируются (к примеру, если после вызова в .NET примените where), в отличие от процедур, которые вытаскивают всю выборку. Опять же, такой вариант позволит вам работать с ними как с IQueryable, что является несомненным плюсом.

    Если у вас EDMX, то эти функции замапятся автоматически мастером. Если Code First, то вам нужен https://github.com/moozzyk/CodeFirstFunctions, Nuget пакет называется EntityFramework.CodeFirstStoreFunctions.

    Мы использовали (и используем данный подход) с 2013 года - за это время проблем с ним не было. Еще момент, это работает только для MSSQL, если что-то другое используете, то этот вариант не подойдет.

    К примеру, в моей случае, БД внезапно стала PostgreSQL, и я сделал немного по-другому. Выборку замапил на представление, где сделал умножение JOIN-ов, чтобы получить всевозможные варианты (в моем случае это связка сущность-ресурсы-язык_ресурса:

    CREATE OR REPLACE VIEW public.v_companies AS 
     SELECT c.id,
        c.isdeleted,
        c.hversion,
        c.modifydate,
        c.modifierid,
        l.id AS languageid,
            CASE
                WHEN cr.id IS NOT NULL THEN cr.name
                ELSE cr_fb.name
            END AS name
       FROM companies c
         JOIN languages l ON true --- тада!
         LEFT JOIN company_resources cr ON c.id = cr.companyid AND cr.languageid = l.id
         LEFT JOIN company_resources cr_fb ON c.id = cr_fb.companyid AND cr_fb.languageid = (( SELECT crx.languageid
               FROM company_resources crx
              WHERE c.id = crx.companyid
             LIMIT 1))
      ORDER BY c.id, (
            CASE
                WHEN cr.name IS NOT NULL THEN 0
                ELSE 1
            END)


    И сделал extension-метод для получения модели данного View, куда я отдавал CurrentLanguageId и делал по нему фильтрацию.
    Ответ написан
    Комментировать
  • Как вызвать форму из DLL?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Ну вообще-то точно так же.
    Форма просто будет в библиотеке. Добавляете ее в ссылки проекта и все. Класс должен быть публичным (public).
    Ответ написан
    4 комментария
  • Как извлечь данные из Excel (.xslx) файла в двухмерный массив (по столбцам)?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Если единоразовая операция, сохраняете файл в формат Таблица XML 2003 и спокойно работаете с ним как с XML. Там вообще все элементарно, через XPathNavigator можно спокойно размотать документ как угодно.

    Еще вариант - использовать провайдер Microsoft.ACE.OLEDB.12.0.
    Там такая строка подключения:
    Provider=Microsoft.ACE.OLEDB.12.0; Data Source=NameOfFile.xlsx;Extended Properties="Excel 12.0;HDR=No;IMEX=1"

    Вот тут пишут:
    stackoverflow.com/questions/6649363/microsoft-ace-...

    Оба варианта использовал - первый на PHP, второй на .NET - работают прекрасно.
    Ответ написан
    Комментировать
  • Какая бд лучше подойдёт для реализации очереди?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Мы в своем решение, написанном на .NET, в момент, когда потребовалось внедрить очередь, просто поставили Microsoft Message Queue. Сейчас, если бы у меня был выбор и подобная задача, я бы остановился скорее на RabbitMQ, а может и нет. Все зависит от задач.

    Отвечая на вопрос, используйте ZeroMQ/RabbitMQ/MSMQ и не изобретайте колесо. Для них не нужно БД, да и реализовывать это куда проще чем городить взаимодействие с БД.

    А еще, можно попробовать к примеру, Hangfire, но это не совсем очередь а больше планировщик задач.
    Ответ написан
  • Объясните как правильно применять паттерн Repository с Entity Framework?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Репозиторий дает одинаковый набор общих API, таких как :
    • IEnumerable<TModel> GetModels();
    • TModel GetModelByID(int modelId);
    • void InsertModel(TModel model);
    • void DeleteModel(int modelID);
    • void UpdateModel(TModel model);
    • void Save();


    IEnumerable<TModel> GetModels(); иногда меняется на IQueryable<TModel>GetModels(), тем более в данном примере это более правильно (так как GetModels не имеет параметров, то материализация должна быть в самый последний момент).

    Тоже и с сохранением. Нужно сохранить новые значения пользователя и записать в историю, получается нужно вызвать операции 2х репозитариев и как-то скоординировать сохранение, что бы откатить при сбое. Как решается эта проблема?


    Это решается с помощью сервисов или Unit of Work, которые построены вокруг объединения репозиториев, связанных единой бизнес-логикой, единого экземпляра контекста, единой транзации где нужно и т.п.

    Пример всего этого добра можно глянуть, к примеру, вот тут: https://www.asp.net/mvc/overview/older-versions/ge...

    Статейка старенькая, но для общего понимания пойдет. Но самая соль не в этом. Соль ситуации в том, что EF сам по себе UoW, а его DbSet-ы - это репозитории. Соответственно, вам нужны репозитории лишь в том случае, если вы желаете поддержку работы с несколькими, назовем это, бакэндами. В данном конкретном случае бакэендами могут быть:
    • EF
    • NHibernate
    • Linq2db
    • SqlClient/Npgsql/MySQL/etс (тут сложнее и потребуется поработать)
    Ответ написан
    Комментировать