C #, данные Linq от EF неприятностей - PullRequest
0 голосов
/ 29 октября 2010

У меня нет большого опыта в программировании.Я работаю (чтобы учиться) над проектом.Я использую C # 4.0 и WPF 4 с EF (SQLite).У меня проблемы с LINQ.

Вот код, о котором идет речь (надеюсь, этого достаточно, дайте мне знать, если потребуется больше)

        private void cboSelectCompany_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        using (ShippingEntities context = new ShippingEntities())
        {
            var companies = from company in context.Deliveries
                            where company.State == cboSelectCompany.SelectedItem.ToString()
                            select company;

            txtDeliveryName.Text = companies.Name;
            txtDeliveryState.Text = companies.State;
        }

Последние две строки не работают.Я неправильно понимаю, что возвращает LINQ?Я просто получаю эту ошибку

Error   5   'System.Linq.IQueryable<SqliteDemo.Delivery>' does not contain a definition for 'State' and no extension method 'State' accepting a first argument of type 'System.Linq.IQueryable<SqliteDemo.Delivery>' could be found (are you missing a using directive or an assembly reference?)   c:\users\dan\documents\visual studio 2010\Projects\SqliteDemo\SqliteDemo\DeliveryCompanies.xaml.cs  49  51  SqliteDemo

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

Ответы [ 3 ]

2 голосов
/ 29 октября 2010

Ты рядом!

Linq возвращает Queryable набор Deliveries, который еще не выполнен. На основании чтения вашего кода, я предполагаю, что вы ожидаете не более одного результата, а затем хотите поместить эти значения в некоторый пользовательский интерфейс. В этом случае вам нужно сделать следующее:

  1. Возьмите свой IQueryable и выполните его
  2. Убедитесь, что вы захватили первую (или, альтернативно, принудительную, что есть только одна) строка
  3. Установите соответствующие значения в пользовательском интерфейсе.

Итак, оставьте там строку с запросом, а затем измените остаток на что-то вроде этого:

var company = companies.FirstOrDefault();
txtDeliveryName.Text = company.Name;
txtDeliveryState.Text = company.State;

При необходимости вставьте нулевую проверку и перейдите к проверке различий между First, FirstOrDefault, Single и SingleOrDefault, чтобы увидеть, какой из них кажется наиболее правильным для вашей конкретной ситуации.

0 голосов
/ 29 октября 2010

Просто используйте companies.FirstOrDefault() или companies.Single() для доступа к первому элементу, поскольку по умолчанию LINQ возвращает коллекцию элементов, а не только один элемент.

0 голосов
/ 29 октября 2010

Ну, похоже, companies.State не компилируется, потому что companies это список SqliteDemo.Delivery (а не просто SqliteDemo.Delivery).

Чего вы хотите достичь?Представьте, что ваш запрос LINQ возвращает несколько результатов, возможно ли это?

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