Возникли проблемы при записи LINQ to SQL Query при сохранении данных базы данных в классы объектов C # - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь хранить данные базы данных в классах C # и писать запросы, используя эти данные.Однако, когда я пишу свой запрос, используя LINQ to SQL, я не могу понять, как заставить его вернуть только один из столбцов в моем классе.Когда я выполняю запрос как «product», а не «product.Description», он запрашивает все столбцы, существующие в Product класса C #.Следующий код дает мне красные кривые над запросом, и ошибка говорит:

Невозможно неявно преобразовать тип System.Linq.IQueryable<string> в System.Linq.IQueryable<OnlineOrderingWebPage<Product>>.
Существует явное преобразование.Вам не хватает актерского состава?

string connStr =
    System.Configuration.ConfigurationManager.ConnectionStrings["FinalProjectConnectionString"].ToString();
DataContext db = new DataContext(connStr);
Table<Product> tProduct = db.GetTable<Product>();

IQueryable<Product> custQuery =
from product in tProduct
where product.Description == "Black Bean"
select product.Description;

foreach (Product product in custQuery)
{
    lblTest.Text = ("Product: " + product.ProductID.ToString() +
        " Description: " + product.Description);
}

Я работаю над приложением корзины для покупок, которое извлекает информацию о товарах из разных точек магазина, позволяя покупателям выбирать товары в зависимости от выбранного ими магазина.Может кто-нибудь, пожалуйста, помогите направить меня в правильном направлении относительно того, как исправить эту ошибку.

Я просто пытаюсь убедиться, что все работает правильно с моим соединением и запросом.Я просто хочу иметь возможность запрашивать определенные столбцы в таблицах, а не весь объект продукта.

Когда я запускаю приложение с «выбором продукта», я получаю ошибку «Невозможно привести объект типа« System.Int32 »к типу« System.String »в строке кода foreach.

Ответы [ 3 ]

1 голос
/ 30 апреля 2019

Ваша проблема - последняя строка вашего рейтинга LINQ

IQueryable<Product> custQuery =
    from product in tProduct
    where product.Description == "Black Bean"
    select product.Description;   <== this line

Оператор select вернет IEnumerable<T> указанного вами типа. В этом случае он возвращает IEnumerable<string>, потому что Product.Description является string. Вы можете проверить это, изменив свой IQueryable<Product> на IEnumerable<string>.

Если вы хотите вернуть все Product с описанием «Black Bean», просто измените select product.Description на select product

var custQuery =
    from product in tProduct
    where product.Description == "Black Bean"
    select product;

Если вы проверяете отладчик / редактор, custQuery имеет тип IEnumerable<Product>.

Рекомендуется также использовать var в качестве возвращаемого типа вместо IQueryable<T> или IEnumerable<T>.

1 голос
/ 30 апреля 2019

Следует указать, что таблица относится к типу Product:

Table<Product> tProduct = db.GetTable<Product>();

Затем используйте ключевое слово var для вашего custQuery и выберите продукт, так как вы хотите, чтобы объекты Product, а не только их Описание:

var custQuery = from product in tProduct
where product.Description == "Black Bean"
select product;
0 голосов
/ 30 апреля 2019

Поскольку вы выбираете только описание, результат не относится к типу IQueryable<Product>. Просто используйте var вместо этого. Затем вы можете изменить его на реальный тип с помощью рефакторинга Make explicit, если хотите.

var custDescriptions =
    from product in tProduct
    where product.Description == "Black Bean"
    select product.Description;

Здесь вы, вероятно, получите IQueryable<string>, но в других случаях вы можете получить довольно сложные типы, такие как IOrderedEnumerable<IGrouping<string, 'a>>. Тогда var очень удобно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...