LINQ Query возвращает несколько копий первого результата - PullRequest
6 голосов
/ 08 апреля 2010

Я пытаюсь выяснить, почему простой запрос в LINQ возвращает странные результаты.

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

Я хочу запросить это представление на основе длинного. Два примера запросов ниже показывают разные запросы к этому представлению.

var la = Runtime.OmsEntityContext.Positions.Where(p => p.AccountNumber == 12345678).ToList();

var deDa = Runtime.OmsEntityContext.Positions.Where(p => p.AccountNumber == 12345678).Select(p => new { p.AccountNumber, p.SecurityNumber, p.CUSIP }).ToList();

Первый должен вернуть список. Вторым будет список анонимных объектов.

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

Второй запрос вернет мне данные, где номер счета - тот, который я запросил, а другие значения отличаются. По-видимому, это делается для каждого номера счета, т. Е. Если бы я запрашивал один или другой номер счета, все объекты Позиции для одного счета имели бы одинаковое значение (первое в списке Позиций для этого счета) вторая учетная запись будет иметь набор объектов Position, которые имеют одинаковое значение (опять же, первый в своем списке объектов Position).

Я могу написать SQL, который по сути совпадает с любым из двух запросов EF. Они оба возвращаются с результатами (скажем, четыре), которые показывают правильные данные, один номер счета с разными номерами ценных бумаг.

Почему это происходит ??? Есть ли что-то, что я мог делать неправильно, чтобы, если у меня было четыре результата для первого запроса выше, данные первой записи также появлялись в объектах 2-4-го числа?

Я не могу понять, что могло / могло бы быть причиной этого. Я искал в Google все виды ключевых слов и не видел никого с этой проблемой. Мы частично выделяем класс Positions для дополнительной функциональности (смарт-объект) и некоторых интеллектуальных свойств. Есть даже некоторые конструкторы, которые обеспечивают некоторую поддержку типов моделей представлений. Ничего из этого не вызывается в запросе (я на 99% уверен в этом). Тем не менее, мы делаем этот же шаблон во всем приложении.

Единственное, о чем я могу подумать, это то, что отображение в EDMX является ошибочным. Есть ли способ, которым это могло бы произойти, если бы «первичные ключи» в EDMX не были фактически уникальными, учитывая способ построения представления? Я думаю, что разработчик, который импортировал эту модель в EDMX, позволил дизайнеру автоматически выбрать то, что будет уникальным.

Любая помощь дала бы измученному разработчику некоторую надежду!

Ответы [ 2 ]

13 голосов
/ 09 апреля 2010

Ответ на этот конкретный вопрос таков:

УБЕДИТЕСЬ, ЧТО ВАШИ КЛАВИШИ ENTITY УНИКАЛЬНЫ !!!

Представление в том виде, в котором оно было сгенерировано в EDMX, имеет три столбца / свойства, которые были помечены как ключи сущности (я полагаю, это комбинация создания уникального идентификатора для записи).

В моих запросах эти три столбца были одинаковыми. Я предполагаю, что структура сущностей взбесилась и просто поместила первую запись во все последующие записи, пока не изменился один из этих столбцов (таким образом, новый уникальный «набор»).

Теперь, когда я понял это, я оглянулся на то место, где эта информация была впервые использована, и увидел, что сначала был применен оператор группировки (данные запрашиваются с помощью хранимой процедуры в другом месте приложения). , Группа выровняла один из столбцов ключа сущности так, чтобы он всегда был уникальным. Это приводит к тому, что результаты в этом месте выглядят нормально.

Мое решение состоит в том, чтобы добавить в это представление новый столбец, который просто проецирует GUID (используя NEWID () в SQL). Проблема в том, что я знаю, что не знаю, как сказать EDMX использовать это новое добавленное свойство в качестве единственного ключа сущности для отображаемого представления!

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

0 голосов
/ 09 апреля 2010

Вы пробовали этот тип синтаксиса? Не могу представить, что это причина, но кто знает ...

using (var dc = new OmsEntityContext())
{
  var la = (from p in dc.Position
  where p.AccountNumber = "12345678"
  select p).ToList();
}

и

using (var dc = new OmsEntityContext())
{
  var deDa = (from p in dc.Position
  where p.AccountNumber = "12345678"
  select new {p.AccountNumber, p.SecurityNumber, p.CUSIP}).ToList();
}

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