2013-05-17 36 views
0

我想要做的就是模擬一個隨機令牌,它將通過url從另一個系統發送。這等系統也將在數據庫中插入3個值:在MVC3中計數查詢數組時出錯

  • ID
  • IP
  • 當前時間

現在時,在另一個時間,客戶端訪問應用程序,它必須有與首次訪問系統相同的IP和ID,時間差必須在30分鐘以內,否則會話將不會被認證,並且機器將被限制併發送到錯誤頁面。

我有一個問題:

  • 當我執行session[] sessionArray = a.ToArray();出現以下錯誤:

{"FUNCTION cgdimport.DiffMinutes does not exist"}

通過WiiMaxx作爲解釋:

no your ERROR isn't there your error is EntityFunctions.DiffMinutes(b.start, DateTime.Now). because your b doesnt contains a function called DiffMinutes()

所以,我想替代方案:

ar a = (from b in data.session 
where b.idsession == sessionid 
&& b.ip == clientip 
&& DateTime.Now <= b.start + new TimeSpan(0, 0, 30, 0) 
select b); 

但它給我下面的錯誤:

DbArithmeticExpression arguments must have a numeric common type.

而另:

var a = (from b in data.session 
          where b.idsession == sessionid 
          && b.ip == clientip 
          && DateTime.Now <= b.start.AddMinutes(30) 
          select b); 

但出現此錯誤:

LINQ to Entities does not recognize the method 'System.DateTime AddMinutes(Double)' method, and this method cannot be translated into a store expression.

public ActionResult SessionController() 
    { 
     var data = new cgdimportEntities(); 



     //Request sessionnid from the URL 
     if (!Request.QueryString["token"].IsEmpty() && Request.QueryString["token"] != null) 
     { 
      //Obtain client IP 
      string clientip = HttpContext.Request.UserHostAddress; 


      //Request sessionid from url 
      string sessionid = Request.QueryString["token"]; 
      //string sessionid = token; 

      //Dummy Test Insert 

      var sessionvar = new session {idsession = sessionid, ip = clientip, start = DateTime.Now}; 

      data.session.Add(sessionvar); 


      try { data.SaveChanges(); } 

      catch (DbEntityValidationException dbEx) 
       { 
       foreach (var validationErrors in dbEx.EntityValidationErrors) 
       { 
        foreach (var validationError in validationErrors.ValidationErrors) 
        { 
         Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}", validationErrors.Entry.Entity.GetType().FullName, 
            validationError.PropertyName, validationError.ErrorMessage); 
        } 
       } 
       } 

      //old code 
      //var a = (from b in data.session 
         //where b.idsession == sessionid 
         //&& b.ip == clientip 
         //&& EntityFunctions.DiffMinutes(b.start, DateTime.Now) < 30 
         //select b); 
      //old code 
      //var a = (from b in data.session 
         //where b.idsession == sessionid 
         //&& b.ip == clientip 
         //&& DateTime.Now <= b.start + new TimeSpan(0, 0, 30, 0) 
         //select b); 

      //new code 
       var a = (from b in data.session 
         where b.idsession == sessionid 
         && b.ip == clientip 
         && DateTime.Now <= b.start.AddMinutes(30) 
         select b); 


      int count = 0; 


      //ERROR HERE! ERROR HERE! 
      session[] sessionArray = a.ToArray(); 


      foreach (var i in sessionArray) 
      { 
       count++; 
      } 

      //if 0 rows are counted 
      if (count == 0) 
      { 
       Session["authenticated"] = "false"; 
       return RedirectToAction("Erro", "Login", new { erro = "No rows counted" }); 
      } 
      //Once all queries are verified, the user is authenticated 
      Session["authenticated"] = "true"; 
      return RedirectToAction("Painel", "Data"); 
     } 
      Session["authenticated"] = "false"; 
      return RedirectToAction("Erro", "Login", new { erro = "Query is null" }); 
    } 
+0

沒有你的錯誤是不存在的你的錯誤是'EntityFunctions.DiffMinutes(b.start,DateTime.Now)'。因爲你的**不包含一個稱爲'DiffMinutes()'的功能' – WiiMaxx

+0

感謝您的快速響應。 我試圖替代: 'VAR一個=(從步驟b中data.session 其中b.idsession ==的sessionid && b.ip == clientip && DateTime.Now <= b.start +新時間跨度(0,0,30,0) 選擇b);' 但它給我以下錯誤: DbArithmeticExpression參數必須有一個數字常見的類型。 –

+0

嘗試'b.start.AddMinutes(30)'而不是'b。啓動+新TimeSpan(0,0,30,0)' – WiiMaxx

回答

0

因爲DateTime比較的一個參數是一個常數(對於查詢),你可以採取AddMinutes關閉查詢應刪除例外:

DateTime nowMinus30Minutes = DateTime.Now.AddMinutes(-30); 

var a = (from b in data.session 
     where b.idsession == sessionid 
      && b.ip == clientip 
      && nowMinus30Minutes <= b.start 
     select b); 
+0

它似乎工作!非常感謝 :) –

2

使用EntityFunctions添加分鐘

ar a = (from b in data.session 
where b.idsession == sessionid 
&& b.ip == clientip 
&& DateTime.Now <= System.Data.Objects.EntityFunctions.AddMinutes(b.start, 30) 
select b); 
+0

我似乎無法使用EntityFunctions,WiiMaxx說要嘗試一些類似的東西。 您的代碼使我有以下錯誤: 「{」功能cgdimport.AddMinutes不存在「}」 –

+0

我很抱歉,我不熟悉的錯誤,但看起來像你缺少參照或正在引用一個不包含該功能的舊庫...您使用的是EntityFramework的哪個版本?也許添加錯誤的更多細節。 – sergioadh

+0

我使用的Visual Studio專業2012年,所以我想這將使EF v。5 詳情在這裏[http://pastebin.com/raw.php?i=mBryjr8y] –