2010-04-04 6 views
22
var cityList = from country in 
        doc.Element("result") 
        .Element("cities") 
        .Descendants("city") 
select new { 
     Name = country.Element("name").Value, 
     Code = country.Element("code").Value, 
     CountryCode = int.Parse(country 
         .Element("countrycode") 
         .Value) 
    }; 

foreach(var citee in cityList) 
{ 
    City city = new City(); 
    city.CountryID = from cnt in db.Countries 
        where cnt.DOTWInternalID == citee.CountryCode 
        select cnt.ID; 
} 

Tôi gặp lỗi trên truy vấn thứ hai như đã thấy trong tiêu đề của bài đăng này. Tôi đã thử chuyển đổi thành int thành nullable int nhưng không có gì hiệu quả. Giúp tôi, các bạn.Không thể chuyển đổi hoàn toàn loại 'System.Linq.IQueryable <int>' thành 'int?'

Cảm ơn

+0

Có nhiều ví dụ của bạn hơn không? Có vẻ như đối tượng Thành phố sẽ luôn bị loại bỏ sau mỗi lần lặp của vòng lặp? – R0MANARMY

Trả lời

35

nó sẽ trở lại một IQueryable, bạn sẽ cần phải làm một cái gì đó giống như sử dụng đầu tiên

cit.CountryID = db.Countries.First(a=>a.DOTWInternalID == citee.CountryCode).ID 
+0

oops tôi đã rất câm để hỏi câu hỏi này, thực sự tôi đã không nhận thấy điều này, thực sự tôi đã được tất cả thời gian này tập trung vào này cnt.DOTWInternalID == citee.CountryCode không phải là ID trở về .. * sigh * – Aneef

+2

Không câm , Tôi bắt đầu với LINQ và câu trả lời này chỉ là những gì tôi cần! cảm ơn – pauloya

2

Như thông báo lỗi nói, truy vấn LINQ của bạn trả về một System.Linq.IQueryable (cho tất cả các tính năng một bộ sưu tập của ints). Nếu bạn muốn nhận một trong số họ, bạn có thể gọi số First hoặc ElementAt(n) để lấy yếu tố thứ n.

5

IQueryable không phải là một đơn int - nhưng một truy vấn mà có thể đại diện cho một bộ sưu tập.

6

Đây là vấn đề và giải pháp

từ cnt trong db.Countries nơi cnt.DOTWInternalID == citee.CountryCode chọn cnt.ID phần. Nếu bạn bỏ qua ID thì nó trả về một IEnumerable chung với Quốc gia (hy vọng rằng bạn có lớp Quốc gia). Vì vậy, những gì bạn phải làm là đầu tiên trả về các tiêu chí lựa chọn và chọn hàng đầu tiên sau đó là lĩnh vực ID. Tương tự như hình dưới đây.

cit.CountryID = (from cnt in db.Countries where cnt.DOTWInternalID == citee.CountryCode select cnt).First<Country>().ID; 

Điều này sẽ giải quyết được sự cố của bạn.

8

Đã trôi qua một thời gian dài kể từ lần cập nhật cuối cùng cho bài đăng nhưng tôi nghĩ rằng nó đáng để cải thiện giải pháp.

Theo ý kiến ​​của tôi, các giải pháp được đăng cho kịch bản cụ thể này không phải là cách tốt nhất về mặt biểu diễn để lấy ID bạn cần. Một giải pháp tốt hơn là như sau.

db.Countries.Where(a=>a.DOTWInternalID == citee.CountryCode) 
      .Select(a => a.ID).FirstOrDefault(); 

Các statemants trước về cơ bản chạy một truy vấn SQL tương tự như sau:

SELECT TOP (1) ID 
FROM [dbo].[Countries] 
WHERE DOTWInternalID = 123 

Các giải pháp đề xuất làm việc nhưng về cơ bản làm một "SELECT *" để tạo ra các thực thể với tất cả các giá trị và sau đó lấy ID từ đối tượng vừa tạo.

Bạn có thể sử dụng Linqpad để xem SQL được tạo và điều chỉnh truy vấn LINQ hoặc Lambdas.

Hy vọng nó sẽ giúp một số người khác nhận được bài đăng này.

0
cit.CountryID = db.Countries.First(a=>a.DOTWInternalID == citee.CountryCode).ID