无法将类型“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<int>' to 'int'
FirstOrDefault() 是一个同步方法,将返回 int,而 FirstOrDefaultAsync() 将返回一个 Task这是问题和解决方案
来自 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!”