无法隐式转换类型“Program.Data.View”为“System.Linq.IQueryable<Program.Data.View>”。

4

目标/问题: 我正在尝试使用First或FirstOrDefault从数据库中返回1个结果。我遇到了以下错误:

Cannot implicitly convert type 'Program.Data.view' to System.Linq.Iqueryable An explicit conversion exists (are you missing a cast)

尝试过的方法: 在查阅文档和许多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()

请检查我的答案。 - AmirReza-Farahlagha
4个回答

5
First()以及类似的方法(比如FirstOrDefault()Count()Average())并不返回一个IQueryable<Program.Data.view>,也不使用延迟执行。 First()会立即执行,并且只返回一个(第一个)Program.Data.view
因此,错误信息是正确的。请将您的签名更改为:
public Program.Data.view GetDataFromQuery()

将提到的这行代码修改为:

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

1
当你使用像First(), FirstOrDefault(), Single(), SingleOrDefault(), Count()这样的方法时,返回的数据类型是你在Entity-Framework中映射的数据类型。
当你使用Entity-Framework工作时,你知道EF数据库获取数据的时间吗?
看一下这个示例:
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 表的数据。
请注意,ToList()ToListAsync() 方法总是调用数据库并执行查询。

0
最终有效的方法如下所示:
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错误(在LINQ to Entities中,方法“Skip”只支持排序输入。在调用方法“Skip”之前必须先调用方法“OrderBy”... 这发生在.DataBind()上)。

0

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

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

请注意,这种替换并不严格等价:即使db.view没有数据,它也不会抛出异常。

意思是它不会抛出异常?如果它在Try/Catch块内呢? - seesharp
@seesharp 如果源集合为空,则 First 将抛出异常。在同样的情况下,Take 只会返回一个空集合。如果您的代码应该在输入为空时抛出异常,则需要自行检查结果长度。 - Aleks Andreev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接