0

我要做的是模拟一个随机令牌,该令牌将从另一个系统通过 url 发送。这个其他系统还将在数据库中插入 3 个值:

  • ID
  • 知识产权
  • 当前时间

现在,在另一个时间,客户端访问应用程序时,它必须与第一次访问它的系统具有相同的 IP 和 ID,并且时间差必须在 30 分钟以内,否则会话未通过身份验证,机器将被限制并发送到错误页面。

我有一个问题:

  • 当我执行时session[] sessionArray = a.ToArray();出现以下错误:

{“函数 cgdimport.DiffMinutes 不存在”}

正如 WiiMaxx 所解释的:

不,您的错误不存在您的错误是 EntityFunctions.DiffMinutes(b.start, DateTime.Now)。因为您的 b 不包含名为 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 参数必须具有数字通用类型。

还有一个:

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 无法识别方法 'System.DateTime AddMinutes(Double)' 方法,并且此方法无法转换为存储表达式。

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" });
   }
4

2 回答 2

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);
于 2013-05-17T14:00:31.833 回答
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);
于 2013-05-17T14:45:39.173 回答