我无意中忘记提供正确的Linq语句并编译,运行该项目。并且偶然发现了一种非常奇怪的行为。
我希望得到此代码抛出的异常,但相反,它是由于该方法而被移交的。意思是,异常附加到我的" GetAllProducts"的返回值。方法
这是我的示例代码:
public static IEnumerable<Product> GetAllProducts()
{
try
{
using (var ctx = new MyContext())
{
return ctx.Products.Select(p => new Product { });
}
}
catch (Exception e)
{
throw new MySpecificException(e);
}
}
如果有人能解释这种行为,我会很开心:)
答案 0 :(得分:5)
.Select
是一个延迟操作 - 它实际上不会查询或收集任何记录,直到您枚举IEnumerable<T>
您应该从.ToList()
或.ToArray()
返回一些内容。这些实际上导致IEnumerable<T>
(或技术上IQueryable<T>
)枚举。
答案 1 :(得分:1)
要清楚,此方法不返回任何异常,此方法的返回值也不附加异常。此方法返回的是IEnumerable<Product>
,可以枚举,但尚未枚举。 “枚举”是指通过一系列事物并对集合中的每件事做一些事情。
当GetAllProducts
方法返回时,尚未触及数据库,但返回IEnumerable<Product>
,将在枚举IEnumerable<Product>
时尝试查询数据库。
如果您想捕获您看到的异常,请在代码中添加try
/ catch
块,最终枚举IEnumerable<Product>
,如下所示:
var products = GetAllProducts();
try
{
foreach(var product in products) // Enumeration happens here, exception thrown
{
// do something with each product
}
}
catch (Exception e)
{
// Handle exception
}