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

36
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 但仍未解决问题。请帮帮我。

谢谢


你的示例还有更多内容吗?看起来每次循环后,City对象都会被丢弃? - Roman
6个回答

50

它会返回一个 iQueryable,你需要执行类似使用 First 的操作

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

哎呀,我真是太蠢了,居然问了这个问题。其实我没有注意到这一点,我一直在关注的是 cnt.DOTWInternalID == citee.CountryCode 而不是返回的ID... 叹气 - Aneef
4
不傻,我刚开始学习 LINQ,这个答案正是我需要的!谢谢。 - pauloya

16

自上次更新以来已经过去了很长时间,但我认为改进这个解决方案是值得的。

在我看来,为了获得所需的ID,针对这种特定情况发布的解决方案并不是性能最好的方式。一个更好的解决方案如下。

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

前面的语句基本上运行了类似以下SQL查询语句:

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

提出的解决方案可行,但基本上会执行 "SELECT *" 以创建具有所有值的实体,然后从刚创建的对象中获取ID。

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

希望对阅读此帖子的其他人有所帮助。


你的解决方案对我很有用... 我只是想知道为什么 FirstOrDefault() 可以正常工作,但 FirstOrDefaultAsync() 抛出错误:无法隐式转换类型 'System.Threading.Tasks.Task<int>' 为 'int' - half of a glazier
FirstOrDefault() 是一个同步方法,将返回 int,而 FirstOrDefaultAsync() 将返回一个 Task<T>,在这种情况下是 int。我建议您阅读下面的文章,以更好地理解异步编程:https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/ - Charles

6

以下是问题和解决方案:

从db.Countries中选择cnt,其中cnt.DOTWInternalID等于citee.CountryCode,然后选择cnt.ID。 如果省略ID,则返回一个泛型IEnumerable,其中包含Country(假设您有Country类)。因此,您需要首先返回选择条件并选择第一行,然后是ID字段。就像下面所示的那样。

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

这将解决你的问题。

5

IQueryable不是一个单独的int,而是可以表示集合的查询。


2
正如错误信息所说,你的Linq查询返回了一个System.Linq.IQueryable(实质上是一组整数)。如果你想获取其中一个元素,可以使用FirstElementAt(n)来获取第n个元素。请注意保留HTML标签。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接