无法将类型'System.Linq.IQueryable <int>'隐式转换为'int?'

Ane*_*eef 31 c# linq iqueryable

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;
}
Run Code Online (Sandbox Code Playgroud)

我在第二个查询中收到错误,如本文标题所示.我试着转换成intnullable int,但毫无效果.帮我,伙计们.

谢谢

Pha*_*bus 45

它会返回一个iQueryable,你需要做一些像使用First的东西

cit.CountryID = db.Countries.First(a=>a.DOTWInternalID == citee.CountryCode).ID
Run Code Online (Sandbox Code Playgroud)

  • 不是傻瓜,我是从linq开始的,这个答案就是我需要的!谢谢 (3认同)

Cha*_*les 12

自上次更新帖子以来已经过了很长时间,但我认为值得改进解决方案.

在我看来,针对此特定方案发布的解决方案并不是获得所需ID的最佳方式.更好的解决方案如下.

db.Countries.Where(a=>a.DOTWInternalID == citee.CountryCode)
            .Select(a => a.ID).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

以前的statemants基本上运行类似于以下的SQL查询:

SELECT TOP (1) ID
FROM [dbo].[Countries]
WHERE DOTWInternalID = 123
Run Code Online (Sandbox Code Playgroud)

建议的解决方案可以工作,但基本上做一个"SELECT *"用所有值创建实体,然后从刚刚创建的对象中获取ID.

您可以使用Linqpad实际查看生成的SQL并调整LINQ查询或Lambdas.

希望它有助于其他一些人来到这篇文章.


won*_*nde 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;
Run Code Online (Sandbox Code Playgroud)

这将解决您的问题.


Mag*_*gie 5

IQueryable不是单个int - 而是可以表示集合的查询.