2014-04-07 2 views
0

Приведенный ниже код работает для случаев, когда в таблице «Кредитная карта» уже есть записи для пользователя, который вошел в систему; однако, когда пользователь не имеет записи в таблице кредитных карт, запрос находит нулевые записи, как ожидалось. Проблема заключается в том, что инструкция maxccid = query.Maxccid(); возвращает исключение Null и исключение InvalidOpeation. Я не могу сделать поле ccid в базе данных нулевым, поскольку оно является частью первичного ключа. Мне нужен способ определить, будет ли этот запрос возвращать нуль до того, как я его запустил, или способ его уловить (желательно без попытки улова, так как это условие будет иметь место для каждого нового клиента (лучшие практики для Try/Catch state это Неправильное использование Try/Catch). Просто добавьте, что я использую Entity Framework.Как я могу обнаружить или обработать результат Null Query в MVC?

ОБНОВЛЕНИЕ 4/9/14: Я изменил запрос, чтобы исправить проблему, о которой я сообщал в комментариях к Usesr FailedProgramming и Майк. Я до сих пор есть нулевая проблема, хотя.

// Create CreditCard - Write to DB 
    public ActionResult Create(CreditCard model) 
    { 
     EntitiesContext context = new EntitiesContext(); 
     int uid = (int)WebSecurity.GetUserId(User.Identity.Name); // Currently logged-in user 
     short? maxccid = 0; //this will be the max ccid for this user 

     var query = from c in context.CreditCards 
        where c != null && c.UserId == uid select c.CCID; 
     maxccid = query.Max(); 
+0

как насчет if (запрос.Any()) maxccid = query.Max(); – failedprogramming

ответ

1
if(query.Any()) 
    maxccid = query.Max(); 
+0

Спасибо, Майкл. Это не сработало для меня. Это странно, но если в таблице creditCard есть три или более записей, они выполняются так, как я ожидаю (query.Any()) истинно, иначе, если есть одна или две записи, он равен false, который не то, что я хочу , Я думал, что query.Any() должен был возвращать true, если запрос возвращает одну или несколько записей? – SoCal

+0

Я все еще работаю над этим, но я думаю, что это работает Майкл. Я раньше думал, что это не так, но я обнаружил ошибку в моем запросе. – SoCal

+0

Да, это работает Майкл. Спасибо. – SoCal

0

Прежде всего использовать using для объектов Databse.
Во-вторых, используйте оператор null-coalescing. для обработки нуля
Проверьте здесь http://msdn.microsoft.com/en-us/library/ms173224.aspx

public ActionResult Create(CreditCard model) 
{ 

    using(EntitiesContext context = new EntitiesContext()) // using keyword will dispose the object properly. 
    { 
     int uid = (int)WebSecurity.GetUserId(User.Identity.Name); // Currently logged-in user 
     short? maxccid = 0; //this will be the max ccid for this user 

     var query = from c in context.CreditCards 
       where c.UserId == uid && c.CCID == (context.CreditCards.Max(c1 => c1.CCID)) select c.CCID ; 
     maxccid = query.Max() ?? 0; //use null-coalescing operator. 
    } 


} 

Вы можете оптимизировать этот код более в соответствии с вашими потребностями. Надеюсь, это может помочь вам в какой-то момент. Хорошего дня.

+0

Pratik, спасибо за взломать это. Когда я помещаю в выражение using (EntitiesConext ....), это приводит к тому, что статут context.CreditCards не похож на контекст (подчеркивается красным везде, на который ссылаются). – SoCal

+0

Дело в том, что вы можете использовать этот объект контекста только в этом блоке. вы не можете использовать его за пределами области действия. Используйте одну вещь, не использующую ее, если вы не можете ее получить. Просто используйте нулевой оператор colaescing, это поможет вам –

+0

Pratik. Вы не можете использовать оператор Null Coalescing объекты типа short или int. Код работает так, как есть, но я обнаружил, что запрос не дает согласованных результатов. Когда в таблице CreditCards есть только 1 или две записи, query.Max() возвращает ложное значение.Если есть три или более запроса.Max() возвращает истинное значение.Это очень неприятно. Интересно, имеет ли он что-то общее с EntityFramwork в том, что я запрашиваю контекст, а не базу данных напрямую? – SoCal