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

методы, которые возвращают разные типы возврата

У меня есть методы ниже, и они возвращают разные объекты в дополнение к тому, что входные параметры, идущие к этим методам, одинаковы, и я использую те, в которых условие

   public IQueryable<LibraryEnvironment> EnvironmentFields(string spaceFunction, string category, string source)
    {
        return _dbContext.LibraryEnvironment.Where(s => s.SpaceFunction == spaceFunction
                                                                && s.Category == category &&
                                                                 s.EnvironmentSource.Name == source);
    }

    public IQueryable<LibraryEquipment> EquipmentFileds(string spaceFunction, string category, string source)
    {
        return _dbContext.LibraryEquipment.Where(s => s.SpaceFunction == spaceFunction
                                                              && s.Category == category &&
                                                               s.EquipmentSource.Name == source);
    }

    public IQueryable<LibraryLighting> LightingFields(string spaceFunction, string category, string source)
    {
        return _dbContext.LibraryLighting.Where(s => s.SpaceFunction == spaceFunction
                                                             && s.Category == category &&
                                                              s.LightingSource.Name == source);
    }

есть и другие методы, подобные этому виду, а также

Я ищу способ создать общий общий метод среди всех этих методов, но с другим типом возвращаемого значения и не смог понять это. Я использую ядро ​​.Net с ядром EF.

если кто-нибудь предложит какие-либо идеи по этому поводу, которые были бы очень благодарны мне, заранее спасибо


  • Взгляните на Generics, вы можете принять Expression<Func<TInput, TOutputProperty>>, чтобы представить селектор, позволяющий выбрать s.EnvironmentSource, s.EquipmentSource или s.LightningSource 23.01.2020
  • @ColinM, не могли бы вы предоставить нам пример кода, который был бы очень признателен 23.01.2020
  • Есть ли у s.EnvironmentSource, s.EquipmentSource и s.LightingSource общий базовый тип или что-то в этом роде? Я вижу, что все три из них имеют свойство Name. 23.01.2020
  • @Sweeper, да, все они из одной таблицы и переименованы в соответствии с объектами, где мы их используем. 23.01.2020
  • О, так они все одного типа? Какой же тогда это тип? 23.01.2020
  • @Sweeper Тип - это класс сущностей, который также имеет идентификатор, имя и другие свойства. 23.01.2020
  • То, что вы возвращаете IQueryable<T>, фиксировано, но не то, что такое T? Если это так, это может подпадать под действие Co- и Contravariance: docs.microsoft.com/en-us/dotnet/csharp/programming-guide/ | Хотя это очень строго не наследование, оно предназначено для работы очень похоже. Но я никогда не мог вспомнить, какая дисперсия была какой. 23.01.2020
  • Может ли кто-нибудь предложить какие-либо идеи по этому поводу .. 23.01.2020

Ответы:


1

Вы можете использовать метод Set<T> для DbContext для общего доступа к наборам. Если вы поместите все соответствующие свойства вашей фильтрации в базу, вы можете затем ограничить общий параметр этим базовым типом и по-прежнему фильтровать все свои свойства.

Таким образом, ваши классы будут выглядеть примерно так на основе ваших исходных запросов:

public class Entity
{
    public string SpaceFunction { get; set; }
    public string Category { get; set; }
}

public class LightingEquipment : Entity
{
    public LightingSource LightingSource { get; set; }
}

public class LightingSource
{
    public string Name { get; set; }
}

И ваш метод хотел бы этого, используя селектор источника:

public IQueryable<T> Fields<T>(string spaceFunction, string category, string source, Func<T, string> sourceSelector) where T : Entity
{
    return _dbContext.Set<T>().Where(s => s.SpaceFunction == spaceFunction
                              && s.Category == category &&
                              sourceSelector(s) == source);
}

И вы бы назвали этот метод следующим образом:

public void Consumer()
{
    var queryable = Fields<LightingEquipment>("spaceFunction", "category", "source", x => x.LightingSource.Name);
}

Документы для Set<T>()

23.01.2020
  • спасибо за предложение, как я могу вызвать этот метод. 24.01.2020

  • 2

    Я думаю, вы обнаружите, что ваш текущий дизайн самый чистый. Ваш код не является полностью «универсальным», поскольку они берутся из разных таблиц и имеют разные предложения where (например, s.EnvironmentSource.Name == source против s.LightingSource.Name == source).

    Вы можете комбинировать некоторые функциональные возможности, например, обобщая доступ к таблице по типу и комбинируя s.Category == category часть фильтра, но вы собираетесь иметь сочетание рефлексии (или операторов switch) и дженериков, которые могут быть более уродливыми, чем то, что у вас есть сейчас.

    23.01.2020
  • большое спасибо за предложение, я тоже согласен с операторами switch 23.01.2020

  • 3

    Если вам нужен только один метод, возможно, вам сойдет с рук использование универсальных шаблонов, как упомянул @ColinM при проверке типа, чтобы решить, какой блок кода выполнять.
    Не проверял. это, и это может быть неправильный подход. Это немного зависит от того, где вы его используете.

    public T Fields<T>(string spaceFunction, string category, string source)
    {
        Type tt = typeof(T);
        if(tt == typeof(IQueryable<LibraryEnvironment>))
            return _dbContext.LibraryEnvironment.Where(s => s.SpaceFunction == spaceFunction
                                                            && s.Category == category &&
                                                              s.EnvironmentSource.Name == source);
        if (tt == typeof(IQueryable<LibraryEquipment>))
            return _dbContext.LibraryEquipment.Where(s => s.SpaceFunction == spaceFunction
                                                          && s.Category == category &&
                                                            s.EquipmentSource.Name == source);
        if (tt == typeof(IQueryable<LibraryLighting>))
            return _dbContext.LibraryLighting.Where(s => s.SpaceFunction == spaceFunction
                                                          && s.Category == category &&
                                                          s.LightingSource.Name == source);
        return default;
    }
    

    Затем вы можете вызвать метод, указав тип возвращаемого значения:

    Fields<IQueryable<LibraryEnvironment>>("a", "b", "c");
    Fields<IQueryable<LibraryEquipment>>("a", "b", "c");
    Fields<IQueryable<LibraryLighting>>("a", "b", "c");
    
    23.01.2020
  • спасибо, но если вы передаете объекты прямо отсюда Fields<IQueryable<LibraryEnvironment>>("a", "b", "c") и в методе Fields<T> можно ли удалить это условие if .. или любым другим способом 23.01.2020
  • Чем Fields<IQueryable<LibraryEnvironment>>("a", "b", "c") предпочтительнее EnvironmentFields("a", "b", "c")? Даже если вы обобщите запрашиваемую часть, у вас все равно будет `Fields<LibraryEnvironment>("a", "b", "c"), что не лучше оригинала. 23.01.2020
  • EnvironmentFields будет жестко запрограммировано. Я нахожу это немного лучше, но я полностью понимаю вашу точку зрения. 24.01.2020
  • Новые материалы

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

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

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

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

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

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

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