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

Posted

技术标签:

【中文标题】无法将类型“System.Linq.IQueryable<int>”隐式转换为“int?”【英文标题】:Cannot implicitly convert type 'System.Linq.IQueryable<int>' to 'int?' 【发布时间】:2011-02-04 05:42:02 【问题描述】:
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 对象在每次循环迭代后都会被丢弃? 【参考方案1】:

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

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

【讨论】:

哎呀,我问这个问题太愚蠢了,实际上我没有注意到这一点,实际上我一直专注于这个 cnt.DOTWInternalID == citee.CountryCode 而不是返回的 ID.. 叹息 不笨,我从 linq 开始,这个答案正是我所需要的!谢谢【参考方案2】:

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

在我看来,针对此特定场景发布的解决方案在性能方面并不是获得所需 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() 抛出错误:Cannot implicitly convert type 'System.Threading.Tasks.Task&lt;int&gt;' to 'int' FirstOrDefault() 是一个同步方法,将返回 int,而 FirstOrDefaultAsync() 将返回一个 Task,在本例中为 int。我建议您阅读下面的文章以更好地了解异步编程:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…【参考方案3】:

这是问题和解决方案

来自 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;

这将解决您的问题。

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

正如错误消息所述,您的 Linq 查询返回一个 System.Linq.IQueryable(出于所有意图和目的,一个整数集合)。如果您想获得其中一个,您可以调用First 或ElementAt(n) 来获得第n 个元素。

【讨论】:

【参考方案6】:
cit.CountryID = db.Countries.First(a=>a.DOTWInternalID == citee.CountryCode).ID

【讨论】:

以上是关于无法将类型“System.Linq.IQueryable<int>”隐式转换为“int?”的主要内容,如果未能解决你的问题,请参考以下文章

C# 无法将类型为“System.Byte[]”的对象强制转换为类型“System.Data.DataTable

无法将类型“[PHAsset]”的值分配给类型“UIImageView!”

无法将 [Struct] 类型的值快速转换为 [string] 类型

无法将类型“()”的值转换为预期的参数类型“字符串”

无法将“字符串”类型的值转换为预期的参数类型 [任何]

无法将值类型“()”分配给字符串类型?