无法将类型’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 ,您知道,当EFdatabase获取数据时?

看看这个样本:

 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()上