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