2009-06-05 40 views
248

Tôi muốn thêm một số hàng vào cơ sở dữ liệu bằng cách sử dụng LINQ to SQL, nhưng tôi muốn tạo "kiểm tra tùy chỉnh" trước khi thêm các hàng cần biết nếu tôi phải thêm, thay thế hoặc bỏ qua các hàng đang mở . Tôi muốn giữ thông tin giữa máy khách và máy chủ DB càng thấp càng tốt và giảm thiểu số lượng truy vấn.Chuyển đổi kết quả truy vấn LINQ sang từ điển

Để thực hiện việc này, tôi muốn tìm nạp ít thông tin theo yêu cầu để xác thực và chỉ một lần ở đầu quá trình.

Tôi đã nghĩ đến việc làm một cái gì đó như thế này, nhưng rõ ràng, nó không hoạt động. Bất cứ ai có một ý tưởng?

Dictionary<int, DateTime> existingItems = 
    (from ObjType ot in TableObj 
     select (new KeyValuePair<int, DateTime>(ot.Key, ot.TimeStamp)) 
    ) 

Điều tôi muốn có ở cuối sẽ là Từ điển, mà không phải tải xuống toàn bộ đối tượng ObjectType từ TableObject.

Tôi cũng coi đoạn mã sau, nhưng tôi đã cố gắng tìm một cách thích hợp:

List<int> keys = (from ObjType ot in TableObj orderby ot.Key select ot.Key).ToList<int>(); 
List<DateTime> values = (from ObjType ot in TableObj orderby ot.Key select ot.Value).ToList<int>(); 
Dictionary<int, DateTime> existingItems = new Dictionary<int, DateTime>(keys.Count); 
for (int i = 0; i < keys.Count; i++) 
{ 
    existingItems.Add(keys[i], values[i]); 
} 

Trả lời

467

Hãy thử sử dụng the ToDictionary method như vậy:

var dict = TableObj.Select(t => new { t.Key, t.TimeStamp }) 
        .ToDictionary(t => t.Key, t => t.TimeStamp); 
+1

T là gì ở đây ??? – PawanS

+1

@pawan, đó là trình giữ chỗ cho từng phần tử trong điều tra và đưa vào loại đối tượng trong điều tra. – tvanfosson

+0

@ tvanfosson bạn có thể giải thích cho tôi điều đó không. Tôi không thể hiểu được. Bây giờ requirment của tôi là để chuyển đổi A Linq để từ điển. Vấn đề là giá trị là một chuỗi (tạo trong LINQ) định dạng và chìa khóa là p "" "var serverUrl = (từ p trong danh sách [i] .ProjectName chọn {(" tcp: // "+ list [i] .BuildMachineName +" : "+ list [i] .PortNumber +" /CruiseManager.rem ", p)}" "" – PawanS

7

Thử

Dictionary<int, DateTime> existingItems = 
    (from ObjType ot in TableObj).ToDictionary(x => x.Key); 

Hoặc loại có đầy đủ tư phiên bản inferenced sau

var existingItems = TableObj.ToDictionary(x => x.Key); 
+0

Cảm ơn anwser JaredPar. Tôi đã dạy về một cái gì đó như thế, nhưng tôi nghĩ rằng điều này sẽ trả về toàn bộ các đối tượng của loại ObjType, và Iwant để tránh phải tải xuống toàn bộ các đối tượng. – Tipx

+0

@Tipx, bạn có thể cung cấp một số thông tin về những gì bạn muốn lọc không? Thêm một điều khoản lọc là có thể, nhưng tôi không thể nói từ câu hỏi của bạn là gì quan trọng – JaredPar

+0

Tất cả tôi cần phải biết nếu "hàng mới" cần phải được thêm vào, được bỏ qua hoặc thay thế hàng khác là dấu thời gian của đối tượng. Các đối tượng trong DB có rất nhiều trường mà tôi không cần để xác thực và tôi không muốn nhận được hiệu suất của việc nhận toàn bộ đối tượng. Để đơn giản, tôi có một bảng trong BD của tôi với 20 cột, 100 000 hàng và tôi muốn trích xuất một từ điển bằng cách sử dụng các giá trị của 2 cột đầu tiên. – Tipx

96

Nhìn vào ví dụ của bạn, tôi nghĩ rằng đây là những gì bạn muốn:

var dict = TableObj.ToDictionary(t => t.Key, t=> t.TimeStamp); 
+0

Wow ... Nó có thể đơn giản như vậy ...Vì tôi khá mới để lập trình, tôi sẽ cố gắng và làm một chút hồ sơ để đảm bảo rằng dưới mui xe, tôi không nhận được hit của toàn bộ đối tượng. Tôi sẽ giữ cho bạn được đăng. – Tipx

+0

Tôi vừa mới kiểm tra. Đáng buồn thay, trong khi nhận được TableObj, nó lấy tất cả các đối tượng từ db vì vậy tôi cuối cùng nhận được hit. Tôi cũng đã kiểm tra các truy vấn mà cách thứ hai tôi đăng (và muốn tránh) và họ chỉ nhận được các mục cần thiết. Chắc chắn nó có 2 truy vấn để bản thân máy chủ phải tìm kiếm hai lần các bảng, nhưng ánh xạ đối tượng là đủ đơn giản. – Tipx

+6

Bạn có thể thực hiện: TableObj.Select (t => new {t.Key, t.TimeStamp}). ToDictionary (t => t.Key, t => t.TimeStamp); LinqToSql sẽ có thể nhận thấy rằng bạn chỉ muốn hai thứ (từ lựa chọn) và trả lại chúng. Tôi không chắc nó đủ thông minh để đào sâu vào các chi tiết cụ thể của ToDictionary(). – Talljoe

0

Sử dụng namespace

using System.Collections.Specialized; 

Hãy thể hiện của DataContext Lớp

LinqToSqlDataContext dc = new LinqToSqlDataContext(); 

Sử dụng

OrderedDictionary dict = dc.TableName.ToDictionary(d => d.key, d => d.value); 

Để lấy các giá trị sử dụng không gian tên

using System.Collections; 

ICollection keyCollections = dict.Keys; 
ICOllection valueCollections = dict.Values; 

String[] myKeys = new String[dict.Count]; 
String[] myValues = new String[dict.Count]; 

keyCollections.CopyTo(myKeys,0); 
valueCollections.CopyTo(myValues,0); 

for(int i=0; i<dict.Count; i++) 
{ 
Console.WriteLine("Key: " + myKeys[i] + "Value: " + myValues[i]); 
} 
Console.ReadKey(); 
Các vấn đề liên quan