我已经能够用我的第一个MVC项目做很多很酷的事情。但是,我不是一个训练有素的程序员,所以我有时会陷入简单的事情。我使用实体框架和预定义的数据库表列表完成了所有工作,但我的应用程序需要在生成时自动使用新表,因此我决定使用调用函数而不是实体。列出数据库项的页面正在运行,但我在显示特定项的详细信息的页面上遇到问题。我不确定如何传递ID,然后显示该ID的信息......
实体方式
public ActionResult Summary(string id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
ixoc_G0000102_RunSummary ixoc_G0000102_RunSummary = db.ixoc_G0000102_RunSummary.Find(id);
if (ixoc_G0000102_RunSummary == null)
{
return HttpNotFound();
}
return View(ixoc_G0000102_RunSummary);
}
新方式
public ActionResult Summary(string id)
{
if (Session["LoggedUser"] == null)
{
return RedirectToAction("Login", "Account");
}
else
{
UserData userd = (UserData)Session["LoggedUser"];
CustomerData customerd = (CustomerData)Session["LoggedCustomer"];
List<NodeInfo> nodes = siteContext.siServerConnect.GetNodes(customerd.ixguid, customerd.AccessLevel);
nodes = nodes.OrderBy(x => x.name).ToList();
string[] online = siteContext.siServerConnect.GetLiveNodesFromServer();
List<string> nodeNames = new List<string>();
DateTime endTime = DateTime.Now;
TimeSpan periodToQuery = new TimeSpan(7, 0, 0, 0);
DateTime startTime = endTime - periodToQuery;
foreach (NodeInfo n in nodes)
{
nodeNames.Add(n.name);
}
List<AverageNodeValues> runs = siteContext.siServerConnect.GetRuns(nodeNames, startTime, endTime);
runs = runs.Find(id);
DataWrapper wrapper = new DataWrapper(nodes, online, runs);
return View(wrapper);
}
}
Find(id)部分有问题,非常感谢任何帮助!
答案 0 :(得分:1)
查看List<>.Find的文档,它需要一个谓词才能找到一个项目,例如
runs = runs.Find(item => return item.id == id);
或者您可以使用LINQ扩展方法,例如SingleOrDefault()
runs = runs.SingleOrDefault(item => return item.id == id);
如果找不到任何项目,将返回与id
匹配的单个项目,或NULL
。总的来说,我建议使用LINQ方法,因为它们将是更常用的在集合中查找项目的方法,例如List<T>
。
试试看,看看它是否有效。
答案 1 :(得分:0)
如果你在谈论这部分:
List<AverageNodeValues> runs = siteContext.siServerConnect.GetRuns(nodeNames, startTime, endTime);
runs = runs.Find(id);
我猜你试图通过AverageNodeValues
找到一个特定的Id
对象。如果您只是尝试限制第一个查询,则需要执行类似(不知道对象属性是什么)run = runs.Where(x => x.Id == id)
之类的内容,但您可以将其作为List<AverageNodeValues> runs = siteContext.siServerConnect.GetRuns(nodeNames, startTime, endTime).Where(.....)
内联执行。
如果您只想尝试获得单个实体,请使用SingleOrDefault(x => x.Id == id)
或FirstOrDefault(x => x.Id == id)