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;
}
我在第二个查询中收到错误,如本文标题所示。我尝试转换为int
到nullable int
,但没有任何效果。帮助我,伙计们。
由于
答案 0 :(得分:42)
它会返回一个iQueryable,你需要做一些像使用First
的东西cit.CountryID = db.Countries.First(a=>a.DOTWInternalID == citee.CountryCode).ID
答案 1 :(得分:9)
自上次更新帖子以来已经过了很长时间,但我认为值得改进解决方案。
在我看来,针对此特定方案发布的解决方案并不是获得所需ID的最佳方式。更好的解决方案如下。
db.Countries.Where(a=>a.DOTWInternalID == citee.CountryCode)
.Select(a => a.ID).FirstOrDefault();
以前的statemants基本上运行类似于下面的SQL查询:
SELECT TOP (1) ID
FROM [dbo].[Countries]
WHERE DOTWInternalID = 123
建议的解决方案有效,但基本上用"SELECT *"
来创建包含所有值的实体,然后从刚刚创建的对象中获取ID。
您可以使用 Linqpad 实际查看生成的SQL并调整LINQ查询或Lambdas。
希望对其他人有所帮助。
答案 2 :(得分:6)
这是问题和解决方案
来自db.Countries中的cnt,其中cnt.DOTWInternalID == citee.CountryCode选择cnt.ID 部分。如果省略ID,则返回带有Country的Generic IEnumerable(希望您有Country类)。所以你要做的就是首先返回选择标准,然后选择第一行,然后选择ID字段。同样如下所示。
cit.CountryID = (from cnt in db.Countries where cnt.DOTWInternalID == citee.CountryCode select cnt).First<Country>().ID;
这将解决您的问题。
答案 3 :(得分:5)
IQueryable不是单个int - 而是可以表示集合的查询。
答案 4 :(得分:2)
正如错误消息所示,您的Linq查询返回System.Linq.IQueryable(所有意图和目的都是一组int)。如果你想获得其中一个,你可以拨打First或ElementAt(n)来获取第n个元素。
答案 5 :(得分:0)
TABLE INDEX UPDATED ROWS ROWS__SAMPLED STEPS DENSITY AV_KEY_LEN RECOMPUTE STALE
Events PK_Events 18.08.2015 7:45:08 1876754 1876754 5 5,328349E-07 4 True False
Files PK_Files 09.08.2015 18:15:00 411589 411589 3 2,429608E-06 4 True False
Revisions PK_Revisions 07.07.2015 8:10:05 376296 376296 5 2,657482E-06 4 True False
Revisions UQ_Revisions_Guid 07.07.2015 8:10:50 376296 376296 200 2,657482E-06 16 True False
...