这是我的代码
public List<Union100> Get(String IdType)
{
try
{
for (var i = 0; i <= 3; i++)
{
var typeIdOfObjectType = db.Objects.Where(x => x.ObjectsName ==
ObjectTypeName).Select(x => x.ObjectTgId).First();
var d = GetParent();
}
}
catch (exception e)
{
}
}
假设我在第1次迭代的typeIdOfObjectType
变量中为null,因此它应该返回for循环而不是去缓存块
它应该继续i = 2
迭代
我该怎么办?
答案 0 :(得分:2)
将“ First()”替换为FirstOrDefault(),代码将返回NULL且不会引发异常。
这里:
var `typeIdOfObjectType` =
db.Objects
.Where(x => x.ObjectsName == ObjectTypeName)
.Select(x => x.ObjectTgId)
.FirstOrDefault();
答案 1 :(得分:1)
首先,您可以使用FirstOrDefault();
代替First();
然后,您可以在块内使用try/catch
。这样,如果发生异常,循环就不会停止。
例如:
public List<Union100> Get(String IdType)
{
for (var i = 0;i <= 3; i++)
{
try
{
var typeIdOfObjectType = db.Objects.Where(x => x.ObjectsName == ObjectTypeName).Select(x => x.ObjectTgId).FirstOrDefault();
var d = GetParent();
}
catch{}
}
}
答案 2 :(得分:1)
在执行查询的行中,有多个调用,其中一些依赖于它们返回内容之前的调用。如果其中任何一个返回null
,则将引发异常。
使用null传播语法可以帮助您避免这种情况:
for (var i = 0;i <= 3; i++)
{
var typeIdOfObjectType =
db? // If db is null, then typeIdOfObjectType will be null
.Objects? // The same if .Objects is null
.Where(x => x.ObjectsName == ObjectTypeName)
.Select(x => x.ObjectTgId)
.First();
if(typeIdOfObjectType == null)
{
continue; // Jump to the next iteration
}
// (Anything below here will be skipped for any iteration
// where typeIdOfObjectType was null)
}
这将在调用db
和其他值之前检查db.Objects
和Where(..)
的值,并且如果其中一个为NULL
,则将其设置作为变量的值,则可以避免某些例外情况。
另一个null引用来源。如果Where(..)
条款未找到任何内容,则可能是一个例外;如果是这样,.First()
调用将引发异常。因此,您应该将其替换为FirstOrDefault()
,它将返回null
。
最后,我要添加一个检查以查看typeIdOfObjectType
是否为null
,如果是,则调用continue
,这将跳过循环中剩余的任何逻辑,并跳转到嵌套迭代。