我通过从表中选择最大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;
}
答案 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>
,并且它不允许它返回空值(它会引发异常),因为返回值是int
和int
不能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.