2016-04-30 145 views
1

我怎样才能从我的数据库中得到最新的“id”,并将其放入文本框 注意:我必须从我的数据库中返回最新的id。如何从LINQ C#中的数据库中获取数据?

看看这个方法:

public void refresh() 
{ 
    var query = from qc in db.tbl_viewClients select qc.id ; 
    int a = Convert.ToInt32(query.SingleOrDefault().ToString()); 
    txt_id.Text = Convert.ToString(a); 
} 
+0

您能否提供更多信息。什么是表结构。 –

+0

你确定你想要'最高数字',而不是你刚才插入的行的ID吗?因为否则并发会导致麻烦。而且效率很低。 –

+0

ID或密钥并不意味着在用户界面中显示特定数据库生成的值。不能指望多个用户看到相同的顶级ID,并让他们认为他们会在他们的交易中获得顶级ID + 1的价值。 –

回答

2

由于Max会丢InvalidOperationException,所以您应该处理没有记录。

var query = from qc in db.tbl_viewClients select qc.id; 
if (query.Any()) 
{ 
    var max = query.Max(); 
    txt_id.Text = max.ToString(); 
    // do rest of work 
} 
else 
{ 
    //handle the case when you have no record 
} 

但这种方法枚举查询两次!
这是一个窍门!

var query = from qc in db.tbl_viewClients select (int?)qc.id; 
var max = query.Max(); 
if (max.HasValue) 
{ 
    txt_id.Text = max.ToString(); 
    // do rest of work 
} 
else 
{ 
    //handle the case when you have no record 
} 
1

假设id存储为int和最新意味着最大的ID,你可以简单地使用Max() *:

int a = query.DefaultIfEmpty(0).Max(); 

否则,信息确定最新,如创建日期,从问题中缺失。

*)加DefaultIfEmpty(0)返回0如果query返回没有结果。

+0

如果所有的id都小于零怎么办? – dotctor

+1

@dotctor ['DefaultIfEmpty()'](https://msdn.microsoft.com/en-us/library/bb360179%28v=vs.100%29.aspx)仅影响结果*以防'query'返回没有结果*,表示如果表中没有任何标识。否则,只有实际的ID被考虑在内。 – har07

+0

我错了。事实上,我脑中出现了一些问题,我用一种不好的方式解释了它。当结果为'0'时,这种方法的问题是最大的'id'或表中没有记录。 – dotctor

1

请尝试此操作。

var query = from t in table orderby t.Id descending 
        select t.Id; 

object result = query.FirstOrDefault(); 

希望有所帮助。

1

如果你正在尝试做我认为你自己的东西(插入一些东西到数据库中,然后查询它以找到你认为是刚刚插入的ID),然后停下来!这样做不会确保您检索的ID是您需要的ID,因为您的数据库可以随时由其他人更改(并发性)。但是,考虑到这只是一个测试,只是你是谁使用它,你需要知道你刚插入的ID,那么这样做的方法是:

假设你使用LINQtoSQL或实体框架,当你添加一个对象到上下文并调用SaveChanges(),紧接着这个对象将会填充它的ID(或主键)字段。请检查!

相关问题