Сохранение результата запроса в переменную

Я очень новичок в С#, и у меня есть некоторые проблемы с правильным пониманием универсальных типов. В этом примере я хотел бы каким-то образом сохранить результат запроса в переменную.

Код, который я показал ниже, неверен, потому что должен быть указан универсальный тип T.

    public class Data
    {
        public IQueryable<T> Results { get; set; }

        public Data()
        {
            var db = new Database();
        }
        public void Store()
        {
            Results = db.Products.Select(x => new { x.ProductName, x.Cost });
        }
    }

Можно ли сделать это без объявления специального класса только для одного использования, как этот?

public class ProductView 
{
   public string ProductName { get; set; }
   public int Country { get; set; }
}
...
public IQueryable<ProductView > Results { get; set; }

Кроме того, почему динамический тип не подходит в этом примере?

public dynamic Results { get; set; }

person ferrin    schedule 25.08.2019    source источник


Ответы (2)


Есть 3 способа решить эту проблему:

1) Создайте класс, подобный ProductView, о котором вы упомянули, - классический С# 6 или более старый способ.

2) Используйте dynamic вместо T, например: public IQueryable<dynamic> Results { get; set; } - не рекомендуется, так как это увеличивает риск ошибок во время выполнения и снижает читабельность

3) Используйте кортежи (функция C#7):

public IQueryable<(string, int)> Results { get; set; } // I suppose ProductName is string and Cost is int

public void Store()
{
    Results = db.Products.Select(x => (x.ProductName, x.Cost));
}
person ingvar    schedule 25.08.2019

Проблема здесь в том, что ваш класс Data, похоже, знает некоторые специфические вещи о T. В методе Store он считывает Products и получает два конкретных свойства от каждого элемента. Так что на самом деле это не общий класс, который может хранить любой тип. Это очень специфично.

Чтобы сделать его универсальным, вам нужно удалить метод Store. И тогда осталось не так много. Вам нужно решить, какова цель Data. Какую проблему он решает?

person Daniel Earwicker    schedule 25.08.2019