2014-10-17 12 views
5

Mục tiêu của tôi là sử dụng truy vấn LINQ Where trên bộ sưu tập ConfigurationManager.ConnectionStrings trong ứng dụng bảng điều khiển (giả sử ứng dụng bảng điều khiển .NET 4.5 mới có tham chiếu System.Configuration được thêm vào và tuyên bố using sửa đổi).Sử dụng LINQ Nơi truy vấn chỉ nhận được một số ConfigurationManager.ConnectionStrings

tôi bắt đầu với điều này, mà không không việc:

var relevantSettings = 
     ConfigurationManager.ConnectionStrings.Where(s => s.Name.StartsWith("Xyz")); 

Nó nói với tôi rằng:

The type arguments for method ' IEnumerable<TSource> System.Linq.Enumerable.Where<TSource(this IEnumerable<TSource>, Func<TSource,bool>) ' cannot be inferred from the usage. Try specifying the arguments explicitly.

này bắt tôi mất cảnh giác, vì vậy tôi cố gắng này để kiểm tra của tôi sanity, nhưng điều này không không hoạt động hoặc:

foreach (var settingsin ConfigurationManager.ConnectionStrings) 
{ 
    if (settings.Name.StartsWith("Xyz")) Console.WriteLine("Found one!"); 
} 

Nó phàn nàn không về báo cáo kết quả foreach, nhưng về các bit .Name, với các lỗi:

Could not resolve symbol 'Name'

Tôi hiểu rằng có lẽ một cái gì đó ngăn chặn các trình biên dịch suy luận kiểu 's var, để kiểm tra kỹ Tôi đã thử điều này không làm việc:

foreach (ConnectionStringSettings settings in ConfigurationManager.ConnectionStrings) 
{ 
    if (connectionString.Name.StartsWith("Xyz")) Console.WriteLine("Found one!"); 
} 

Tuy nhiên, điều đó không giúp ích gì cho tôi nhiều, ngoại trừ việc giải quyết vấn đề trước mắt của tôi. Tôi muốn hiểu những gì đang diễn ra ở đây.

Tất cả những gì tôi muốn làm là sử dụng một câu lệnh LINQ Where đơn giản để nhận một tập con của các chuỗi kết nối trong app.config của tôi. Tại sao trình biên dịch ngăn cản tôi làm điều này?

Trả lời

13

TL; DR Version

Bạn cần phải làm một .Cast<ConnectionStringSettings>() để làm công việc này.

Chi tiết

Vâng, nếu bạn đào thậm chí sâu hơn một chút, bạn có thể nhận được biên dịch để cho bạn biết nhiều hơn:

Func<ConnectionStringSettings, bool> StartsWithXyz = c => c.Name.StartsWith("Xyz"); 
var relevantSettings = ConfigurationManager.ConnectionStrings.Where(StartsWithXyz); 

Đây là nói với bạn:

Cannot convert instance argument type ' System.Configuration.ConnectionStringSettingsCollection ' to ' System.Collections.Generic.IEnumerable<System.Configuration.ConnectionStringSettings> '

Lái xe lên cây thừa kế của tài sản ConnectionStringSettings bạn cuối cùng có thể thấy thủ phạm, điều này rất có ý nghĩa: thuộc tính đó là của không chung IEnumerable loại. Điều này trong thực tế làm cho câu hỏi một bản sao khá phức tạp của this question, như là giải pháp nằm trong đúc tài sản không chung chung vào một danh sách chung chung, để LINQ và trình biên dịch có thể làm phép thuật của họ. Quay lại đầu trang |Đối với kịch bản đặc biệt này, các sau không việc:

var relevantSettings = ConfigurationManager.ConnectionStrings 
              .Cast<ConnectionStringSettings>() 
              .Where(c => c.Name.StartsWith("Xyz")); 

Thưởng thức!

+1

+1 Không chỉ bản sao của [that] (http://stackoverflow.com/q/776397/419956) mà còn của [this] (http://stackoverflow.com/questions/26414317/system-data -datarowcollection-không-không-chứa-một-định nghĩa-cho-tolist-và-không) tôi đã trả lời 9 giờ trước. Về cơ bản lý do cho điều này là các lớp đó lớn tuổi hơn Generics trong C#. –

+0

Vâng, tôi đoán có thể có nhiều bản sao hơn, một khi bạn * làm * hiểu được vấn đề, nó sẽ dễ dàng phát hiện ra chúng. Tôi đã sử dụng tính năng "Đặt câu hỏi" làm vịt cao su, giúp tôi tìm câu trả lời của mình. Tôi figured văn bản của tôi * có thể giúp những người khác * tìm kiếm cho trường hợp cụ thể của vấn đề này, và vì có vẻ như không phải là một về 'ConnectionStrings' nhưng vì vậy tôi đăng nó anyways. – Jeroen

+0

Nó không có nghĩa là chỉ trích. Trong trường hợp này, không rõ lý do tại sao họ không cho phép [lớp] (http://msdn.microsoft.com/en-us/library/system.configuration.configurationelementcollection%28v=vs.80%29.aspx) triển khai 'IEnumerable ' vì nó cũng từ .NET 2.0, nơi generics được giới thiệu. Tôi đoán rằng họ đã không được hoàn thành tại thời điểm sinh của lớp đó, –

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