2009-09-29 24 views
43

Tôi thường so sánh dữ liệu trong các bảng trong cơ sở dữ liệu khác nhau. Các cơ sở dữ liệu này KHÔNG có cùng một lược đồ. Trong TSQL, tôi có thể tham khảo chúng với DB> user> cấu trúc bảng (DB1.dbo.Stores, DB2.dbo.OtherPlaces) để lấy dữ liệu để so sánh. Tôi thích ý tưởng của LINQPad khá một chút, nhưng tôi dường như không thể dễ dàng kéo dữ liệu từ hai bối cảnh dữ liệu khác nhau trong cùng một tập hợp các câu lệnh.LINQPad, sử dụng nhiều datacontexts

Tôi đã thấy mọi người đề xuất chỉ cần thay đổi chuỗi kết nối để kéo dữ liệu từ nguồn khác vào lược đồ hiện tại nhưng, như tôi đã đề cập, điều này sẽ không làm. Tôi vừa bỏ qua một trang trong FAQ? Điều này có vẻ là một thủ tục khá thường xuyên để không có sẵn cho tôi.

Trong thế giới "dễ dàng", tôi rất muốn có thể chỉ cần tham chiếu đến dữ liệu văn bản đã nhập mà LINQPad tạo ra. Sau đó, tôi có thể chỉ đơn giản là:

DB1DataContext db1 = new DB1DataContext();

DB2DataContext db2 = new DB2DataContext();

Và làm việc ở đó.

Trả lời

5

Tôi không nghĩ rằng bạn có thể thực hiện việc này. Xem this LinqPad request.

Tuy nhiên, bạn có thể tạo nhiều tệp dbml trong một dll riêng biệt và tham chiếu chúng trong LinqPad.

+0

Cho đến nay, đây cũng là kết luận của tôi. Tôi đã hy vọng tôi đã sai! Cảm ơn nhiều. –

+0

liên kết đã chết với lỗi ** 404 không tìm thấy trang **. –

54

Cập nhật: bây giờ có thể thực hiện truy vấn SQL Server cơ sở dữ liệu chéo trong LINQPad (từ LINQPad v4.31, với giấy phép LINQPad Premium). Để sử dụng tính năng này, hãy giữ phím Control trong khi kéo cơ sở dữ liệu từ Schema Explorer đến cửa sổ truy vấn.

Cũng có thể truy vấn máy chủ được liên kết (mà bạn đã liên kết bằng cách gọi sp_add_linkedserver). Để thực hiện việc này:

  1. Thêm kết nối LINQ to SQL mới.
  2. Chọn Chỉ định Cơ sở dữ liệu Mới hoặc Hiện tại và chọn cơ sở dữ liệu chính bạn muốn truy vấn.
  3. Nhấp vào hộp kiểm Bao gồm Cơ sở dữ liệu bổ sung và chọn (các) máy chủ được liên kết từ danh sách.
+0

Thật tuyệt vời, chính xác những gì tôi cần! –

+0

"Lỗi: Tên đối tượng không hợp lệ 'sys.servers'." –

+0

"Lỗi: Nhà cung cấp OLE DB" SQLNCLI10 "cho máy chủ được liên kết" XXXXXXXXXX "không chứa bảng" "chính". "Sys". "Cơ sở dữ liệu" ". Bảng không tồn tại hoặc người dùng hiện tại không có quyền trên bàn đó. " –

8

Hãy nhớ rằng bạn luôn có thể tạo một ngữ cảnh khác theo cách riêng của mình.

public FooEntities GetFooContext() 
{ 
    var entityBuilder = new EntityConnectionStringBuilder   
       {   
        Provider = "Devart.Data.Oracle",   
        ProviderConnectionString = "User Id=foo;Password=foo;Data Source=Foo.World;Connect Mode=Default;Direct=false", 
        Metadata = @"D:\FooModel.csdl|D:\FooModel.ssdl|D:\FooModel.msl"  
       }; 

    return new FooEntities(entityBuilder.ToString()); 
} 
+0

'FooEntities là gì '? tôi có thể viết mã này bên trong 'LINQPad'? nếu có, làm thế nào? –

4

Bạn có thể nhanh chóng như nhiều bối cảnh như bạn muốn khác nhau ví dụ SQL và thực hiện cơ sở dữ liệu giả chéo tham gia, sao chép dữ liệu, vv Lưu ý, tham gia trên những bối cảnh được thực hiện tại địa phương, do đó bạn phải gọi ToList(), ToArray (), v.v. để thực hiện các truy vấn bằng cách sử dụng các nguồn dữ liệu tương ứng của chúng một cách riêng lẻ trước khi tham gia. Nói cách khác nếu bạn "bên trong" nối 10 hàng từ DB1.TABLE1 với 20 hàng từ DB2.TABLE2, cả hai bộ (tất cả 30 hàng) phải được kéo vào bộ nhớ trên máy cục bộ của bạn trước khi LINQ thực hiện phép nối và trả về liên quan/giao nhau đặt (tối đa 20 hàng cho mỗi ví dụ).

//EF6 context not selected in Linqpad Connection dropdown 
var remoteContext = new YourContext(); 
remoteContext.Database.Connection.ConnectionString = "Server=[SERVER];Database=" 
+ "[DATABASE];Trusted_Connection=false;User ID=[SQLAUTHUSERID];Password=" 
+ "[SQLAUTHPASSWORD];Encrypt=True;"; 
remoteContext.Database.Connection.Open(); 
var DB1 = new Repository(remoteContext); 

//EF6 connection to remote database 
var remote = DB1.GetAll<Table1>() 
    .Where(x=>x.Id==123) 
    //note...depending on the default Linqpad connection you may get 
    //"EntityWrapperWithoutRelationships" results for 
    //results that include a complex type. you can use a Select() projection 
    //to specify only simple type columns 
    .Select(x=>new { x.Col1, x.Col1, etc... }) 
    .Take(1) 
    .ToList().Dump(); // you must execute query by calling ToList(), ToArray(), 
       // etc before joining 


//Linq-to-SQL default connection selected in Linqpad Connection dropdown 
Table2.Where(x=>x.Id = 123) 
    .ToList() // you must execute query by calling ToList(), ToArray(), 
       // etc before joining 
    .Join(remote, a=> a.d, b=> (short?)b.Id, (a,b)=>new{b.Col1, b.Col2, a.Col1}) 
    .Dump(); 

localContext.Database.Connection.Close(); 
localContext = null; 
+0

Ý của bạn là đóng và không localContext hoặc remoteContext ở dưới cùng? Ngoài ra, YourContext được định nghĩa ở đâu? – NetMage

Các vấn đề liên quan