2016-04-30 5 views
1

Как я могу получить последний «id» из моей базы данных и поместить его в текстовое поле note: мне нужно вернуть последний идентификатор из моей базы данных.Как я могу получить данные из моей базы данных в 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

Вы уверены, что хотите «наибольшее число», а не идентификатор строки, которую вы только что вставили? Потому что в противном случае параллелизм может вызвать проблемы. И это довольно неэффективно. –

+0

Идентификаторы или ключи не предназначены для отображения в пользовательском интерфейсе специально созданных значений базы данных. Нельзя ожидать, что несколько пользователей смогут увидеть один и тот же идентификатор верхнего уровня и заставить их думать, что они получат первое значение 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 хранится в междунар и последнее означает крупнейший идентификатор, вы можете просто использовать Max() *:

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

В противном случае информация для определения последних, таких как Дата создания, отсутствует в этом вопросе.

*) добавлен DefaultIfEmpty(0) для возврата 0 в случае query возвращение нет результат.

+0

Что делать, если все идентификаторы меньше нуля? – dotctor

+1

@dotctor ['DefaultIfEmpty()'] (https://msdn.microsoft.com/en-us/library/bb360179%28v=vs.100%29.aspx) влияет только на результат * в случае, если 'query' возвращает нет результата *, то есть, если в таблице нет идентификатора. В противном случае учитываются только фактические идентификаторы. – 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, который вы только что вставили, тогда способ сделать это:

Предполагая, что вы используете LINQtoSQL или Entity Framework, когда вы добавляете объект контекста и вызов SaveChanges(), сразу после этого объект будет иметь заполненный им идентификатор (или первичный ключ). Просто проверьте!

Смежные вопросы