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

Определение C# IQueryable для различных типов сущностей

//I need to deifne productQuery here
    if (test == true)
    {
      var productQuery = ordersRepository.ProductIn; //it returns IQueryable<ProductIn> type
    }
    else
    {
      var productQuery = ordersRepository.ProductOut; //it returns IQueryable<ProductOut> type
    }

Как определить переменную productQuery?

Благодарю вас!

[РЕДАКТИРОВАТЬ]

dynamic productType;

if (test == true)
    {
      productType = ordersRepository.ProductIn; //it returns IQueryable<ProductIn> type
    }
    else
    {
      productType = ordersRepository.ProductOut; //it returns IQueryable<ProductOut> type
    }

var productQuery = productType as IQueryable<ProductIn>;
if (productQuery == null)
{
     productQuery = productType as IQueryable<ProductIn>;
}

Я делаю так, это правильно?


  • Во втором примере: попробуйте object вместо dynamic. 14.06.2012
  • Я попытался с объектом, но в сообщении об ошибке говорится: «Ошибка 16« объект »не содержит определения« Где »и не может быть найден метод расширения «Где», принимающий первый аргумент типа «объект» (вам не хватает директивы использования или ссылка на сборку?) ' 14.06.2012
  • вы должны вызывать Linq-методы после cast.. var foo = productQuery as IQueryable<ProductIn>; if (foo != null) { foo.Where(..) Я не проверял это, но я считаю, что это работает нормально. 14.06.2012

Ответы:


1

Вы можете объявить его как динамический тип, если вы не против отложить разрешение типа до времени выполнения.

dynamic productQuery;
if (test == true)
{
    productQuery = ordersRepository.ProductIn; //it returns IQueryable<ProductIn> type
}
else
{
    productQuery = ordersRepository.ProductOut; //it returns IQueryable<ProductOut> type
}

Другой вариант — объявить его как тип object, а затем при необходимости привести его обратно к другому типу.

object productQuery;

if (test == true)
{
    productQuery = ordersRepository.ProductIn; //it returns IQueryable<ProductIn> type
}
else
{
    productQuery = ordersRepository.ProductOut; //it returns IQueryable<ProductOut> type
}

// ... more logic ...
var unboxed = productQuery as IQueryable<ProductIn>;
if (unboxed != null) {
    unboxed.Where( ... and away you go with Linq ...);
}

Обновление после редактирования операции

Допустим, у вас есть динамический тип productQuery. Чтобы использовать Linq на нем, вам нужно определить типы делегата. Предположим, что типы ProductIn и ProductOut имеют строковое свойство ProductNo. Затем вы можете написать свой запрос следующим образом, снова используя dynamic.

productQuery.Where(new Func<dynamic,bool>(item => item.productNo));

Однако... я думаю, вы могли бы значительно облегчить себе жизнь, изменив весь свой подход. Вы явно работаете против общего интерфейса для ProductIn и ProductOut, так почему бы не определить это явно?

public interface IProduct
{
    public string ProductNo { get; set; }
}

public class ProductIn : IProduct { ... }
public class ProductOut : IProduct { ... }

Теперь ваш код становится намного проще. Напишите это так:

IQueryable<IProduct> productQuery;

if (test == true)
{
    productQuery = ordersRepository.ProductIn; //it returns IQueryable<ProductIn> type
}
else
{
    productQuery = ordersRepository.ProductOut; //it returns IQueryable<ProductOut> type
}

string myResult = productQuery.Where(item => item.productNo == productNo).FirstOrDefault(); 
14.06.2012
  • Ты за твой комментарий! Я пробовал это, если (productQuery.GetType() == typeof(IQueryable‹ProductIn›)) { productQuery = productQuery as IQueryable‹ProductIn›; } else { productQuery = productQuery as IQueryable‹ProductOut›; } productQuery = productQuery.Where(x =› x.productNo == productNo); НО В сообщении об ошибке говорится: «Ошибка 15. Невозможно использовать лямбда-выражение в качестве аргумента для динамически отправляемой операции без предварительного приведения его к типу делегата или дерева выражений». 14.06.2012
  • @Expertwannabe, можете ли вы написать отдельный запрос Linq для каждого типа внутри условных блоков? 14.06.2012
  • @dbaseman Я пишу только один запрос Linq 'productQuery = productQuery.Where(x => x.productNo == productNo);' потому что оба объекта имеют productNo. 14.06.2012
  • @Expertwannabe Я думаю, что лучшим подходом было бы определить интерфейс для двух классов и работать против него. Смотрите мой обновленный ответ. 14.06.2012
  • Новые материалы

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

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

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

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

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

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

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