无法将类型 '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
时,您知道吗,当 EF
从 database
获取数据时?
看这个样本:
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())
上
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
时,您知道吗,当 EF
从 database
获取数据时?
看这个样本:
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())
上