【问题标题】:How to properly get data from a database, manipulate it and serve to a view?如何正确地从数据库中获取数据,对其进行操作并提供给视图?
【发布时间】:2017-05-22 19:29:43
【问题描述】:

我是 C# 数据库的新手,我有一个 MVC 项目,我尝试在用户进行搜索后从数据库中获取、操作数据并将数据提供给视图。我能够从 db 获得结果,但不能用它做任何事情。 IQueryable 正在返回一个“结果视图”列表,其中包含来自 db 的所有行值,问题是我不知道如何访问该数据,因为“结果视图”是在运行时创建的,我不能使用 SearchResult.ResultsView [ 0].City 或运行时之前的某些内容会导致其内容为空。

请告诉我如何正确获取和操作数据库中的数据,IQueryable 在运行时返回一个列表,但接下来 ???如果您能稍微解释一下或提供一些文档以供阅读,我将非常感激。谢谢!

我有一堂课:

namespace Test.Models
{
[Table("LInfo")]
public class LInfo
    {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int LId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string StreetAddress { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
    public int DistrictNo { get; set; }

    public virtual Image Image { get; set; }
    public virtual ApplicationUser ProcessedBy { get; set; }
    public int Pass { get; set; } //pass 0,1,2,3
    }
}

映射到哪个Image id:

namespace Test.Models
{
[Table("Img")]
public class Img
    {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ImgId { get; set; }
    public byte[] FileContents { get; set; }
    public string FileName { get; set; }
    public int FileSize { get; set; }
    public bool Anonymous { get; set; }
    public bool Unreadable { get; set; }
    public bool MultipleFiles { get; set; }
    public DateTime? Pulled { get; set; }
    public virtual ApplicationUser UploadedBy { get; set; }
    public virtual ICollection<LetterInfo> Letters { get; set; }
    }
}

还有这个控制器:

namespace Test.Controllers
{
public class SearchController : Controller
    {
    // GET: Search
    public ActionResult Index()
    {
        return View(new SModel());
    }
    [HttpPost]
    public ActionResult Index(SModel model)
    {
        ApplicationDbContext db = new ApplicationDbContext();
        int districtNo = Convert.ToInt32(model.DistrictNo);
        IQueryable SResult = db.LetterInfos.Where(l => l.DistrictNo == districtNo && l.State == model.State)
                         .Select(s => s);


        return View();
        }
    }
}

来自 Visual Studio 的示例:

http://prntscr.com/favjdg

【问题讨论】:

  • 不要忘记处理打开的上下文,并通过调用.ToList()来执行查询,而不是直接枚举IQueryable。

标签: c# asp.net sql-server asp.net-mvc entity-framework


【解决方案1】:

我无法确定您的最终目标,但目前您似乎有: 带有搜索功能的登录页面;此表单应发布到服务器并检索匹配数据作为搜索结果模型。

您的代码很接近,但我可以建议您进行一些更改以帮助您入门。原来……

public ActionResult Index(SearchModel model)
{
    ApplicationDbContext db = new ApplicationDbContext();
    int districtNo = Convert.ToInt32(model.DistrictNo);
    IQueryable SearchResult = db.LetterInfos.Where(l => l.DistrictNo == 
        districtNo && l.State == model.State)
        .Select(s => s);

    return View();
}

这很接近,并且很好地使用了 Linq,但正如之前的答案所建议的那样,IQueryable 接口实际上并不是 执行查询。为此,我将添加 .ToList() 并更改初始数据类型——您可以将其简化为:

var SearchResult = db.LetterInfos.Where(l => l.DistrictNo == 
        districtNo && l.State == model.State)
        .Select(s => s).ToList();

最后,虽然您似乎从数据库中获得了 SearchResults 列表,但您并没有将其作为模型传递给您的视图。您可以选择使用此新模型返回相同的视图,将其绑定到,例如使用 Razor 的隐藏结果表,或者您可以选择返回新视图(您可以看到 View() 列出的多个重载)。

再次,您可以使用此 Index post 方法通过将新填充的对象作为模型添加到您的视图中来传回 new 视图和模型列表,或者您可以重用以某种方式原创:

return View("someView", SearchResult); 
   <or> 
return View(SearchResult);

同样,您还应该在其他 cshtml 视图中指定模型(如果您没有):

@model Namespace.SearchResults
     or 
@model List<Namespace.SearchResult>
     etc

注意:这假设您希望在 same 视图中填充搜索结果,并且您的解决方案中有一个与 SearchResult 对应的公共类。

希望这足以让您入门,祝您好运。

【讨论】:

    【解决方案2】:

    IQueryable 表示查询,而不是集合。它具有 .AsEnumerable() 和 .ToList() 等方法,它们将执行查询并返回一个集合。

    【讨论】:

      【解决方案3】:

      试试这个

      public ActionResult Index(SearchModel model)
          {
              using (ApplicationDbContext db = new ApplicationDbContext())
              {
                  int districtNo = Convert.ToInt32(model.DistrictNo);
                  var SearchResult = db.LetterInfos.Where(l => l.DistrictNo == districtNo && l.State == model.State)
                               .ToList();
      
      
                  return View(SearchResult);
              }
          }
      

      不要忘记修改您的视图,使其接受 IEnumerable&lt;LetterInfo&gt; 作为模型并正确显示它

      【讨论】:

      • 嘿,问题是 SearchResult 在运行前为空,所以我尝试在视图中使用的属性将是一个简单的语法错误,因此项目不会构建。我需要以某种方式在视图中使用具有已定义属性的类,并在运行时将值从 SearchResult 复制到这些属性中。不确定方法:)
      • 你能发表你的看法吗?看起来你做错了什么
      【解决方案4】:

      你需要一个 foreach 来访问你的数据列表

      foreach(var i in SearchResult)
      {
          //"i" will have access to your data
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-17
        • 2016-03-18
        • 1970-01-01
        • 2016-02-15
        • 1970-01-01
        • 2021-01-19
        • 2019-03-26
        • 1970-01-01
        相关资源
        最近更新 更多