如何db.Find(id)没有实体?

时间:2014-10-16 18:51:35

标签: c# asp.net-mvc

我已经能够用我的第一个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)部分有问题,非常感谢任何帮助!

2 个答案:

答案 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)