在MVC3中计数查询数组时出错

本文关键字:数组 出错 查询 MVC3 | 更新日期: 2023-09-27 18:13:59

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

  • ID
  • IP 当前时间

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

我有一个问题:

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

{cgdimport"功能。DiffMinutes不存在"}

WiiMaxx:

no你的错误不在那里,你的错误在那里EntityFunctions.DiffMinutes (b。首先,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。DateTimeAddMinutes(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" });
   }

在MVC3中计数查询数组时出错

使用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);

因为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);