【问题标题】:Search query database first mvc搜索查询数据库先mvc
【发布时间】:2017-08-01 12:32:50
【问题描述】:

我想创建一个搜索按钮,使用户能够搜索成员并加载相关的详细信息。我也在使用 Ajax BeginForm。

有 3 个类/表:

    public Book()
    {
        this.Loans = new HashSet<Loan>();
    }

    public int ISBN { get; set; }
    public string Name { get; set; }
    public string Author { get; set; }

    public int OnLoan { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Loan> Loans { get; set; }
}
   Loan Class
  public partial class Loan
{
    public int LoanId { get; set; }
    public System.DateTime CheckOutDate { get; set; }
    public System.DateTime ReturnDate { get; set; }
    public decimal FinePrice { get; set; }
     public Nullable<int> MemberId { get; set; }
    public Nullable<int> ISBN { get; set; }

    public virtual Book Book { get; set; }
    public virtual Member Member { get; set; }
}

会员等级:

  public partial class Member
    {
        public Member()
        {
            this.Loans = new HashSet<Loan>();
        }

        public int MemberId { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
        public string PostCode { get; set; }
        public int TelNo { get; set; }


        public virtual ICollection<Loan> Loans { get; set; }
    }

在我的 BHistory 控制器中:

public ActionResult HistorySearch(string qh)
{
    var history = Gethistory(qh);

    return PartialView(history);


}
private List<Loan> Gethistory(string searchString)
{
    return db.Loans
        .Where(a => a.MemberId.ToString().Contains(searchString) && a.Book.OnLoan == 1)
       .ToList();
}

所以在搜索工作正常的那一刻,它会返回正确的结果,在浏览器中用户输入 memberid 并且 会出现一个结果列表。但是我只希望出现最后一个结果。不是结果列表

所以我不想使用 ToList(),而是使用 LastorDefault(), 但我收到错误消息: 无法将 Models.Loan 转换为 collections.generic.list。

所以我编辑了 ActionMethod

private Loan Gethistory(string searchString)
    {
        return db.Loans
            .Where(a => a.MemberId.ToString().Contains(searchString) && a.Book.OnLoan == 1)
           .LastorDefault();

但是,当我运行它时,我收到了错误消息:

LINQ to Entities 无法识别方法 'Library1.Models.Loan LastOrDefaultLoan' 方法,并且该方法无法转换为存储表达式。

总之,我如何让最后的结果出现,而不是列表。

这个问题与使用 Last() 或 LastorDefault() 引用答案的问题不同,因为即使我们切换到使用 OrderByDescending() 和 First() 或 FirstorDefault() 答案/结果也不起作用. 错误还在于即使我认为答案不应该返回列表也可以返回列表

谢谢

【问题讨论】:

  • 另外请附上部分视图的源代码HistorySearch
  • 您还应该添加一个 ORDER BY 以确保您获得所需的行。

标签: c# asp.net-mvc linq asp.net-mvc-4 asp.net-ajax


【解决方案1】:

问题是您页面上的模型正在寻找List&lt;Loan&gt;,而您只是向它发送Loan。截至我发布此答案时,您没有控制器方法或视图作为您问题的一部分,因此我会将您的查询更改为:

private List<Loan> Gethistory(string searchString)
{
    var loan = db.Loans
                 .Where(a => a.MemberId
                              .ToString()
                              .Contains(searchString) && 
                             a.Book.OnLoan == 1)
                 .OrderByDescending(a => a.LoanId)
                 .FirstOrDefault();

    return new List<Loan> { loan };
}

正如 Stefan 在他的回答中所说,SQL 没有 LastOrDefault 方法,因此您需要以一种更易于 EF 转换为 SQL 的方式编写查询。

或者,您可以将视图更改为具有单一贷款的模型,尽管这会使您显示它们的(假定的)网格不太直观。

【讨论】:

  • 谢谢,我会尝试一下。感谢您的帮助
  • 不客气。您分享的关于无法将Loan 转换为List&lt;Loan&gt; 的错误消息是我能够推断出这是您的问题的方法。在 Razor 引擎尝试生成您的页面时引发错误。
  • 如果用户输入了不正确的 MemberId,那么我希望在出现 dbnullexception 时出现错误消息。我将如何实施?真的很感激。
  • 如果您正在做单个会员或贷款,您不想返回相同的视图。您应该有多个视图。单个贷款的视图更像是一个详细信息页面,而不是显示多个贷款的网格。
【解决方案2】:

试试这个:

 return db.Loans
        .Where(a => a.MemberId.ToString().Contains(searchString) && a.Book.OnLoan == 1)
        .OrderByDescending(c => c.MemberId)
        .FirstOrDefault();

SQL 看不懂LastOrDefault

因此,您需要订购该列表。通过使用OrderByDescending,您将颠倒此顺序,从而获得最高记录。

如果你还想传入一个集合,也可以使用OrderByDescending

return db.Loans
        .Where(a => a.MemberId.ToString().Contains(searchString) && a.Book.OnLoan == 1)
        .OrderByDescending(c => c.MemberId);

更多详情请见LINQ To Entities does not recognize the method Last. Really?

或者类似的问题:

remove a record with child

【讨论】:

  • 谢谢,我会查看链接。感谢您的帮助
【解决方案3】:

使用 .LastOrDefault(...) 而不是 .where

return db.Loans .LastOrDefault(a => a.MemberId.ToString().Contains(searchString) && a.Book.OnLoan == 1);

它还可以提高你的表现。

【讨论】:

    猜你喜欢
    • 2017-04-25
    • 1970-01-01
    • 2015-03-25
    • 2020-07-25
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多