C# 在使用.first和LINQ时,当序列不包含元素时,有没有一种方法可以设置默认值?

C# 在使用.first和LINQ时,当序列不包含元素时,有没有一种方法可以设置默认值?,c#,C#,我正在使用以下代码: public class BtnCountViews { public int btnCount { get; set; } public int views { get; set; } } var btns = "(BTNACOUNT + BTNBCOUNT) AS BtnCount, VIEWS As Views"; Counts.btnCountViewsToday = db2.Query<BtnCountViews>("SELE

我正在使用以下代码:

public class BtnCountViews
{
    public int btnCount { get; set; }
    public int views { get; set; }
}

var btns = "(BTNACOUNT + BTNBCOUNT) AS BtnCount, VIEWS As Views";
Counts.btnCountViewsToday = 
   db2.Query<BtnCountViews>("SELECT " + btns + " FROM CLICKHISTORY WHERE YYMMDD = " + yymmdd).First();
公共类btncountview
{
public int btnCount{get;set;}
公共int视图{get;set;}
}
var btns=“(BTNACOUNT+BTNBCOUNT)作为BtnCount,视图作为视图”;
Counts.btnCountViewsToday=
Query(“从CLICKHISTORY中选择“+btns+”,其中YYMMDD=“+YYMMDD).First();
当yymmdd日没有返回任何记录时,此错误会显示一条消息,说明
序列不包含任何元素

我确实理解为什么会发生这种情况,但我想知道一些关于如何阻止它抛出异常的建议


如果没有元素,我想做的是Counts.btnCountViewsToday在btnCount和views字段中包含一个填充了0的对象。

尝试使用
FirstOrDefault

 var btnCountViewsToday = 
   db2.Query<BtnCountViews>("SELECT " + btns +
    " FROM CLICKHISTORY WHERE YYMMDD = " + yymmdd).FirstOrDefault();

是的,您可以使用
FistOrDefault
函数,但在这种情况下,当您使用它时,它将返回null

Counts.btnCountViewsToday = 
   db2.Query<BtnCountViews>("SELECT " + btns + " 
       FROM CLICKHISTORY WHERE YYMMDD = " + yymmdd).FirstOrDefault();
if( Counts.btnCountViewsToday != null)
{
}
else 
  //here i am assuming that its object type 
   Counts.btnCountViewsToday =  new ViewTodayObject();    
正如你所说的,int类型比这样的类型好

   var count = db2.Query<BtnCountViews>("SELECT " + btns + " 
           FROM CLICKHISTORY WHERE YYMMDD = " + yymmdd).FirstOrDefault();
    if( count != null)
    {}
   int? count = db2.Query<BtnCountViews>("SELECT " + btns + " 
           FROM CLICKHISTORY WHERE YYMMDD = " + yymmdd).FirstOrDefault();
    if( count.HasValue)
    {
          Counts.btnCountViewsToday = count.Value;
    }
    else 
        Counts.btnCountViewsToday = 0;
int?count=db2.Query(“选择”+btns+”
单击历史记录,其中YYMMDD=“+YYMMDD).FirstOrDefault();
if(count.HasValue)
{
Counts.btnCountViewsToday=count.Value;
}
其他的
Counts.btnCountViewsToday=0;

> p>您应该考虑使用FrestSturror方法< /P>
   var btnCountViewsToday = 
   db2.Query<BtnCountViews>("SELECT " + btns + " FROM CLICKHISTORY WHERE YYMMDD = " + yymmdd).FirstOrDefault();
var btnCountViewsToday=
Query(“从CLICKHISTORY中选择“+btns+”,其中YYMMDD=“+YYMMDD”).FirstOrDefault();

您还应该考虑格式化查询以避免参数嗅探。

返回序列的第一个元素,如果没有,则返回默认值 元素被找到


除此之外,首先要做的是开始使用参数化SQL。您的意思是像
FirstOrDefault()
?如果序列为空,则返回
null
。如果您考虑了一个特定的非空默认元素,那么可以执行
query.FirstOrDefault()??yourDefaultObject
你能举个例子说明我如何使用??此处返回两个字段中均为0的对象。@RenéVogt在其注释
var count=query.FirstOrDefault()中给出了一个示例??0;所以,在本例中,我可以不使用0,而使用new BtnCountViews(){btncount=0,views=0}或new BtnCountViews()之类的内容吗?我认为一个例子作为答案对其他人来说是一个很好的帮助。我也不太清楚如何使用??所以我需要查一下。将btnCountViewsToday的类型从int更改为int?问题是,如果没有记录,我仍然希望创建一个对象,但字段中有0且不为null。答案已更新…一旦您有了
。DefaultIfEmpty(…)
,您就可以以
.First()
结束;在这种情况下,不需要
FirstOrDefault
。@Jeppe Stig Nielsen,你说得对。谢谢你的建议,但我的问题是,如果没有记录,我仍然希望创建一个对象,但字段中有0且不为null。@Alan2-你可以检查我的答案…@Alan2-请在其他部分执行null检查并赋值,这也可以…而此链接可以回答问题,最好在这里包括答案的基本部分,并提供链接供参考。如果链接页面发生更改,只有链接的答案可能会变得无效。我建议您添加一些代码,否则您的答案将被删除并移动到评论中,因为它只有链接…请按照该模式进行其余答案…因为有时链接被删除,您的答案将没有用处,因为没有人知道该链接中有什么内容
   var btnCountViewsToday = 
   db2.Query<BtnCountViews>("SELECT " + btns + " FROM CLICKHISTORY WHERE YYMMDD = " + yymmdd).FirstOrDefault();