Неправильный EntitySet при использовании foreach вместо select - PullRequest
0 голосов
/ 24 июля 2010

Я получил очень простую схему базы данных и создал из нее dbml.Две таблицы связаны в один-ко-многим.(A) 1 - * (B) ... следовательно, каждый A получает EntitySet с именем "BSet".

Если я сделаю:

foreach (var a in db.A)
{
  Console.WriteLine(a.Name);
  foreach (var b in a.BSet)
  {
     Console.WriteLine(b.Number);
  }
}

, я обнаружу, что он печатает то же самоенабор B для каждого A. Если я отлаживаю L2S Log, я вижу, что он создает правильный SQL каждый раз, когда вызывает BSet.Несмотря на это, он печатает один и тот же набор B для каждого A.

Если я напишу оператор LINQ Select, то получу правильный результат.

Что сломано в foreach?Я обычно очень хорошо разбираюсь в тонкостях LINQ, но это меня смущает!

Ответы [ 2 ]

0 голосов
/ 25 июля 2010

Проблема заключалась в том, что в таблице B не был правильно настроен первичный ключ.

Я добавил первичный ключ для поля, который, как я считал, был первичным ключом, но на самом деле его не было.

0 голосов
/ 24 июля 2010

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

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

var query =
  from a in db.A
  from b in a.BSet
  select b.Number;

foreach (var item in query) Console.WriteLine (item);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...