无法将类型 'Program.Data.View' 隐式转换为 System.linq.iqueryable<Program.Data.View>。

Cannot implicitly convert type 'Program.Data.View' TO System.linq.iqueryable<Program.Data.View>.

Goal/Problem: 我正在尝试使用 First 或 FirstOrDefault 仅 return 1 来自数据库的结果。我收到以下错误:

无法将类型 'Program.Data.view' 隐式转换为 System.Linq.Iqueryable 存在显式转换(是否缺少强制转换)

我尝试过的: 在查看了文档和许多 SO 文章之后,我尝试了不同的转换方式,包括下面的代码。文章如Cannot implicitly convert type 'System.Linq.IQueryable<>to . An explicit conversion exists (are you missing a cast?)。大多数文章都是从 System.Linq.IQueryable<> 转向其他方向,而不是这个方向。无论哪种方式投射都应该相对容易,我错过了什么?:

IQueryable<Program.Data.view> someVariable = db.view.First(m => m.ID == Search_ID);

我的方法签名是:

public IQueryable<Program.Data.view> GetDataFromQuery()

First() 和类似的方法(如 FirstOrDefault()Count()Average() 而不是 return IQueryable<Program.Data.view> 并且不使用延迟执行。

First() 立即执行 并且 returns 只有一个(好吧,first) Program.Data.view.

所以错误信息是正确的。将您的签名更改为

public Program.Data.view GetDataFromQuery()

以及提到的行:

Program.Data.view someVariable = db.view.First(m => m.ID == Search_ID);

如果您无法更改 GetDataFromQuery 的签名或者您想保存延迟执行,您可以使用此方法:

db.view.Where(m => m.ID == Search_ID).Take(1);

请注意这个替换并不严格等同:即使 db.view 没有数据也不会抛出

当您使用以下方法时:First()FirstOrDefault()Single()SingleOrDefault()Count() 以及类似的方法,return 您在 Entity-Framework.

中映射的数据类型

当您使用 Entity-Framework 时,您知道吗,当 EFdatabase 获取数据时?

看这个样本:

var result = context.Student.Where(x=>x.Id == model.Id);

在这个示例中,结果类型是IQueryable<T>并且没有调用数据库,这只是一个查询。

现在看这个示例:

var result = context.Student.Where(x=>x.Id == model.Id).ToList();

在此示例中,结果类型为 T 并称为数据库,我们有关于 Student Table.

的数据

注意 ToList()ToListAsync() 方法总是调用数据库并执行查询。

最终起作用的是以下内容:

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);

又名(格式):

Where().GroupBy().Select(...OrderByDescending().FirstOrDefault()).AsQueryable().OrderBy();

不确定为什么其他人会给我错误,但按照这个顺序做是有效的 此外,最后的 OrderBy 在逻辑上似乎完全没有必要,但是当我没有它时我会收到 System.NotSupportedException 错误(方法 'Skip' 仅支持 LINQ to Entities 中的排序输入。必须在方法 'Skip' 之前调用方法 'OrderBy' ...这发生在 .DataBind())