如果使用Linq为空,如何获取表的最大ID或1?

时间:2015-01-14 18:46:07

标签: c# linq

我通过从表中选择最大id来手动插入表的id并将其递增1.如果表为空并且max返回null,我如何使用c#和linq执行此操作i' m using下面的代码,但它给出错误" null值不能分配给类型为System.Int32的成员,这是一个不可为空的值类型"

var t = (from tab1 in db.questions select tab1.QuestionId1).Max();
            if (t!=null)
            {
                 qui = t + 1;
            }

            else
            {
                 qui = 1;
            }

3 个答案:

答案 0 :(得分:3)

这样的事情会起作用吗?

// Assume we want to start with id 1
var maxId = db.Questions
    .Max(q => q.QuestionId1)
    .DefaultIfEmpty(0)
    .Max();

return maxId + 1;

DefaultIfEmpty将处理空表格案例。

数据库通常具有自动增加的id功能。如果您使用的是Entity Framework,则应默认启用它。

答案 1 :(得分:1)

绝对不是获得"新ID"的首选方法。 (更好的是让数据库生成它们),但在这里:

var maxId = ((from tab1 in db.questions select (int?)tab1.QuestionId1).Max() ?? 0) + 1;

或等效,但IMO更容易阅读:

var maxId = (db.questions.Select(x => (int?)x.QuestionId1).Max() ?? 0) + 1

您最初的问题是您使用Max()参数调用IEnumerable<int>,并且它不允许它返回空值(它会引发异常),因为返回值是intint不能null

我将Select()返回的枚举强制转换为Nullable<int>(或简称int?)的可枚举类型,因此Max()会返回{{1}如果枚举为空(如果没有选择行的情况),则允许它返回int?,而不是抛出异常。

答案 2 :(得分:0)

你可能正在寻找类似的东西,使用LINQ的扩展方法语法:

var maxID = db.Questions.Any() 
            ? db.Questions.Max(q => QuestionId1) + 1
            : 1

如果数据库中有Questions,则获取最高QuestionId1并增加1.否则返回1.