2010-04-08 4 views
6

Я пытаюсь понять, почему простой запрос в LINQ возвращает нечетные результаты.Запрос 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 для добавления функциональности (smart object) и некоторых интеллектуальных свойств. Есть даже некоторые конструкторы, которые предоставляют некоторую поддержку типа модели вида. Ничего из этого не вызвано в запросе (я на 99% уверен в этом). Тем не менее, мы делаем эту же схему во всем приложении.

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

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

+3

Возьмите сгенерированный SQL-скрипт и запустите его в интерактивном режиме в Management Studio, чтобы узнать, что происходит в данный момент. –

+0

Как уже говорилось, возможно, используйте профилировщик, чтобы посмотреть, как SQL подвергается экссудации. –

ответ

13

Ответ на этот конкретный вопрос заключается в следующем:

УБЕДИТЕСЬ ВАШ ENTITY ключи уникальны! !!

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

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

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

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

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

+1

Не могли бы вы увязать с другим вопросом? – defines

+0

plz сообщите нам, как вы установили это как PK в поле зрения или в edmx –

+0

Эй, ребята, мне жаль, что у меня не было доступа к этой базе кода. Я оставил эту позицию не дольше, после того как я разместил этот вопрос/вопрос. Прошло некоторое время с тех пор, как я должен был сделать что-то подобное в EF. Это было бы тривиально в свободном API. Если я могу правильно запомнить, я удалил все отдельные ключи, чтобы не создавать составной ключ в сопоставлении, а вместо этого использовал guid, созданный в представлении как PK. –

0

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

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> 
Смежные вопросы