如何从数据库中正确获取数据,操作数据并提供给视图?

时间:2017-05-22 19:29:43

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

我是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
    }
}

哪个图片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

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

试试这个

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<LetterInfo>作为模型并正确显示

答案 2 :(得分:0)

您需要foreach来访问您的数据列表

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

答案 3 :(得分:0)

我无法确定你的最终目标,但似乎目前你有: 带搜索的目标网页;此表单应发布到服务器并检索匹配数据作为searchresult模型。

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

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()列出的多个重载)。

同样,您可以使用此索引发布方法通过将新填充的对象作为模型添加到视图中来传回视图和模型列表,或者您可以重用以某种方式原创:

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

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

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

注意:这假定您希望使用搜索结果填充相同的视图,并且您的解决方案内部有一个与SearchResult对应的公共类。

希望这足以让你开始,祝你好运。