无法将类型’Program.Data.View’隐式转换为System.linq.iqueryable 。
目标/问题:我尝试使用First或FirstOrDefault仅从数据库返回1个结果。 我收到以下错误:
无法将类型’Program.Data.view’隐式转换为System.Linq.Iqueryable存在显式转换(您是否缺少转换)
我尝试过的内容:在查看了文档和许多SO文章之后,我尝试了不同的投射方式,包括下面的代码。 诸如无法将类型’System.Linq.IQueryable 隐式转换为的文章。 存在显式转换(您是否错过了演员?) 。 大多数文章都是从System.Linq.IQueryable 转到其他方面,而不是这个方向。 无论哪种方式铸造应该相对容易,我缺少什么?:
IQueryable someVariable = db.view.First(m => m.ID == Search_ID);
我的方法签名是:
public IQueryable GetDataFromQuery()
First()
和类似方法(如FirstOrDefault()
或Count()
或Average()
)不返回IQueryable
,也不使用延迟执行。
First()
立即执行, 只返回一个 (好,第一个 ) Program.Data.view
。
所以错误信息是正确的。 将您的签名更改为
public Program.Data.view GetDataFromQuery()
和提到的行:
Program.Data.view someVariable = db.view.First(m => m.ID == Search_ID);
当您使用以下方法时: First()
, FirstOrDefault()
, Single()
, SingleOrDefault()
, Count()
等等,返回您在Entity-Framework
映射的数据类型。
当您使用Entity-Framework
,您知道,当EF
从database
获取数据时?
看看这个样本:
var result = context.Student.Where(x=>x.Id == model.Id);
在此示例中,结果类型为IQueryable
并且未调用数据库,这只是一个查询。
现在看看这个样本:
var result = context.Student.Where(x=>x.Id == model.Id).ToList();
在此示例中,结果类型为T
并称为数据库,我们有关于Student
Table的数据。
注意ToList()
或ToListAsync()
方法总是调用数据库并执行查询。
如果您无法更改GetDataFromQuery
签名或者您希望保存延迟执行,则可以使用以下方法:
db.view.Where(m => m.ID == Search_ID).Take(1);
请注意,此替换并不完全等效:即使db.view
没有数据也不会抛出
最终工作的是以下内容:
var someVariable = db.view.Where(m => m.Some_ID == Search_SomeID).GroupBy(x => x.Some_ID).Select(g => g.OrderByDescending(p => p.Column_Two).FirstOrDefault()).AsQueryable().OrderBy(x => x.Column_Three);
AKA(格式):
Where().GroupBy().Select(...OrderByDescending().FirstOrDefault()).AsQueryable().OrderBy();
不知道为什么其他人给了我错误,但是按照这个顺序进行了工作此外,最终的OrderBy似乎完全不必要的逻辑,但是当我没有它时,我得到一个System.NotSupportedException错误(方法’Skip’只支持LINQ to Entities中的排序输入。必须在方法’Skip’之前调用’OrderBy’方法…这发生在.DataBind()上