搜索查询数据库先mvc

Search query database first mvc

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

有3个classes/tables:

    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; }
}

会员Class:

  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();
}

所以目前搜索工作正常,它 return 是正确的结果,在浏览器中用户输入 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() answer/result 行不通。 错误还在于 returning 列表的能力,即使我认为答案不应该 return a list

谢谢

试试这个:

 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

问题是您页面上的模型正在寻找 List<Loan>,而您只发送 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 转换为 [=21] 的方式编写查询=].

或者,您可以将视图更改为具有单个贷款的模型,尽管这会使您显示的(假定的)网格 them/it 不那么直观。

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

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

它还能提高你的表现。