我想要做的就是模擬一個隨機令牌,它將通過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" });
}
沒有你的錯誤是不存在的你的錯誤是'EntityFunctions.DiffMinutes(b.start,DateTime.Now)'。因爲你的**不包含一個稱爲'DiffMinutes()'的功能' – WiiMaxx
感謝您的快速響應。 我試圖替代: 'VAR一個=(從步驟b中data.session 其中b.idsession ==的sessionid && b.ip == clientip && DateTime.Now <= b.start +新時間跨度(0,0,30,0) 選擇b);' 但它給我以下錯誤: DbArithmeticExpression參數必須有一個數字常見的類型。 –
嘗試'b.start.AddMinutes(30)'而不是'b。啓動+新TimeSpan(0,0,30,0)' – WiiMaxx