2010-04-08 35 views
6

Tôi đang cố gắng tìm ra lý do tại sao một truy vấn đơn giản trong LINQ trả về kết quả lẻ.Truy vấn LINQ Trả về nhiều bản sao của kết quả đầu tiên

Tôi có chế độ xem được xác định trong cơ sở dữ liệu. Về cơ bản nó tập hợp một số bảng khác và thực hiện một số dữ liệu đung đưa. Nó thực sự không phải là bất cứ điều gì đặc biệt ngoại trừ thực tế là nó đề cập đến một tập dữ liệu lớn và có thể hơi chậm.

Tôi muốn truy vấn chế độ xem này dựa trên một thời gian dài. Hai truy vấn mẫu bên dưới hiển thị các truy vấn khác nhau cho chế độ xem này.

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(); 

Người đầu tiên sẽ trao lại danh sách. Cái thứ hai sẽ là một danh sách các đối tượng ẩn danh.

Khi tôi thực hiện các truy vấn này trong khung thực thể, công cụ đầu tiên sẽ đưa tôi trở lại danh sách kết quả mà tất cả chúng đều giống hệt nhau.

Truy vấn thứ hai sẽ đưa tôi trở lại dữ liệu trong đó số tài khoản là số mà tôi truy vấn và các giá trị khác sẽ khác nhau. Điều này dường như làm điều này trên cơ sở số tài khoản, tức là nếu tôi truy vấn một số tài khoản hoặc một số đối tượng Vị trí cho một tài khoản sẽ có cùng giá trị (giá trị đầu tiên trong danh sách Vị trí cho tài khoản đó) và tài khoản thứ hai sẽ có một tập các đối tượng Vị trí mà tất cả đều có cùng giá trị (một lần nữa, đối tượng đầu tiên trong danh sách các đối tượng Vị trí).

Tôi có thể viết SQL có hiệu lực giống như một trong hai truy vấn EF. Cả hai đều trở lại với kết quả (nói bốn) hiển thị dữ liệu chính xác, một số tài khoản với các số chứng khoán khác nhau.

Tại sao điều này lại xảy ra ??? Có điều gì đó mà tôi có thể làm sai để nếu tôi có bốn kết quả cho truy vấn đầu tiên ở trên mà dữ liệu của bản ghi đầu tiên cũng xuất hiện trong các đối tượng của 2-4?

Tôi không thể hiểu được điều gì sẽ gây ra điều này. Tôi đã tìm kiếm trên Google tất cả các loại từ khóa và chưa gặp bất kỳ ai có vấn đề này. Chúng tôi chia lớp một phần ra khỏi lớp Positions cho chức năng bổ sung (đối tượng thông minh) và một số thuộc tính thông minh. Thậm chí còn có một số nhà xây dựng cung cấp một số kiểu hỗ trợ kiểu xem. Không có điều nào trong số này được gọi trong yêu cầu (tôi chắc chắn 99% điều này). Tuy nhiên, chúng tôi làm cùng một mẫu trên tất cả các ứng dụng.

Điều duy nhất tôi có thể nghĩ đến là việc ánh xạ trong EDMX rất khó khăn. Có cách nào mà điều này sẽ xảy ra nếu "khóa chính" trong EDMX không thực sự độc đáo cho cách khung nhìn được xây dựng không? Tôi nghĩ rằng dev đã nhập mô hình này vào EDMX để cho nhà thiết kế tự động chọn những gì sẽ là duy nhất.

Bất kỳ trợ giúp nào cũng sẽ mang lại cho bạn một số hy vọng!

+3

Lấy tập lệnh SQL được tạo ra và chạy nó tương tác trong Management Studio để xem những gì thực sự xảy ra –

+0

Như đã nói, có thể sử dụng một profiler để xem SQL đang được excuted. –

Trả lời

13

Câu trả lời cho vấn đề cụ thể này là thế này:

đảm bảo KEYS ENTITY bạn là duy nhất! !!

Chế độ xem như được tạo trong EDMX có ba cột/thuộc tính được đánh dấu là khóa thực thể (tôi đoán kết hợp tạo id duy nhất cho bản ghi).

Trong các truy vấn của tôi, ba cột này đều giống nhau. Tôi giả định rằng khuôn khổ thực thể freaked ra và chỉ cần đặt hồ sơ đầu tiên vào tất cả các hồ sơ tiếp theo cho đến khi một trong những cột thay đổi (do đó, một độc đáo mới "thiết lập"). Bây giờ tôi đã tìm ra rằng tôi nhìn lại nơi mà thông tin này lần đầu tiên được sử dụng và thấy rằng một tuyên bố nhóm được áp dụng đầu tiên (dữ liệu đang được truy vấn thông qua một thủ tục lưu trữ ở một nơi khác trong ứng dụng). Nhóm đã san phẳng ra một trong các cột khóa thực thể sao cho nó luôn là duy nhất. Điều này khiến kết quả ở vị trí đó xuất hiện tốt.

Giải pháp của tôi là thêm một cột mới vào chế độ xem này mà chỉ dự án GUID (sử dụng NEWID() trong SQL). Vấn đề là tôi biết không biết làm thế nào để nói cho EDMX sử dụng thuộc tính mới được thêm này làm khóa thực thể duy nhất cho chế độ xem được ánh xạ!

-Tôi đang đóng này như cố định khi tôi biết vấn đề và sẽ hỏi câu hỏi khác của tôi trong một câu hỏi mới. Cảm ơn tất cả các thông tin chi tiết cho những người dành thời gian để trả lời!

+1

Bạn có nhớ liên kết đến câu hỏi khác không? – defines

+0

plz cho chúng tôi biết làm thế nào bạn đã thiết lập đó như là một PK trong xem hoặc trong edmx –

+0

Xin chào các bạn, tôi ước tôi vẫn có quyền truy cập vào cơ sở mã này. Tôi rời khỏi vị trí này không lâu hơn nữa sau khi tôi đăng câu hỏi này/asnwer. Đã được một thời gian kể từ khi tôi đã phải làm một cái gì đó như thế này trong EF. Nó sẽ là tầm thường trong API thông thạo. Nếu tôi có thể nhớ lại chính xác, tôi đã xóa tất cả các khóa riêng lẻ để không tạo khóa tổng hợp trong ánh xạ nhưng thay vào đó, hãy sử dụng guid được tạo trong dạng xem là PK. –

0

Bạn đã thử loại cú pháp này chưa? Không thể tưởng tượng nó là nguyên nhân gây ra, nhưng ai biết được ...

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> 
Các vấn đề liên quan