C# 搜索查询数据库第一个mvc

C# 搜索查询数据库第一个mvc,c#,asp.net-mvc,linq,asp.net-mvc-4,asp.net-ajax,C#,Asp.net Mvc,Linq,Asp.net Mvc 4,Asp.net Ajax,我想创建一个搜索按钮,使用户可以搜索成员并加载相关详细信息。我也在使用Ajax 共有3个类/表: public Book() { this.Loans = new HashSet<Loan>(); } public int ISBN { get; set; } public string Name { get; set; } public string Author { get; set; } public

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

共有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; }
}
但是,当我运行此命令时,会收到错误消息:

LINQ to Entities无法识别方法“Library1.Models.Loan LastOrDefaultLoan”方法,并且无法将此方法转换为存储表达式

总之,我该如何得到最后一个显示的结果,而不是列表

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

谢谢

试试这个:

 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);
有关更多详细信息,请参阅

或者类似的问题:

试试这个:

 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);
有关更多详细信息,请参阅

或者类似的问题:


问题在于,您页面上的模型正在查找
列表,而您只向其发送
贷款。在我发布此答案时,您的问题中没有控制器方法或视图,因此我将您的查询更改为:

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 };
}
private List Gethistory(字符串搜索字符串)
{
var贷款=db.贷款
.其中(a=>a.MemberId
.ToString()
.包含(搜索字符串)和
a、 Book.OnLoan==1)
.OrderByDescending(a=>a.LoanId)
.FirstOrDefault();
返回新列表{loan};
}
正如Stefan在回答中所说,SQL没有
LastOrDefault
方法,因此您需要以一种更容易让EF转换为SQL的方式编写查询


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

问题是您页面上的模型正在查找
列表,而您只发送
贷款。在我发布此答案时,您的问题中没有控制器方法或视图,因此我将您的查询更改为:

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 };
}
private List Gethistory(字符串搜索字符串)
{
var贷款=db.贷款
.其中(a=>a.MemberId
.ToString()
.包含(搜索字符串)和
a、 Book.OnLoan==1)
.OrderByDescending(a=>a.LoanId)
.FirstOrDefault();
返回新列表{loan};
}
正如Stefan在回答中所说,SQL没有
LastOrDefault
方法,因此您需要以一种更容易让EF转换为SQL的方式编写查询

或者,您可以将视图更改为具有单个贷款的模型,但这会使您正在显示它们/它的(可能)网格不那么直观。

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

归还贷款 .LastOrDefault(a=>a.MemberId.ToString().Contains(searchString)和&a.Book.OnLoan==1)

它还可以提高性能。

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

归还贷款 .LastOrDefault(a=>a.MemberId.ToString().Contains(searchString)和&a.Book.OnLoan==1)


它还可以提高您的性能。

还请包括部分视图
历史搜索的源代码。
您还应添加ORDER BY以确保获得所需的行。还请包括部分视图
历史搜索的源代码。您还应添加ORDER BY以确保获得所需的行。谢谢我要试一试。谢谢你的帮助,不客气。您共享的关于无法将
贷款
转换为
列表
的错误消息是我如何推断这是您的问题。当Razor引擎试图生成您的页面时引发错误。如果用户键入了错误的MemberId,则我希望出现一条错误消息,作为appose to dbnullexception。我将如何实现这一点?真的很感激。如果你正在做一个单一的成员或贷款,你不想返回相同的看法。您应该有多个视图。单个贷款的视图将更多地是一个详细信息页面,而不是显示多个贷款的网格。谢谢,我将尝试一下。谢谢你的帮助,不客气。您共享的关于无法将
贷款
转换为
列表
的错误消息是我如何推断这是您的问题。当Razor引擎试图生成您的页面时引发错误。如果用户键入了错误的MemberId,则我希望出现一条错误消息,作为appose to dbnullexception。我将如何实现这一点?真的很感激。如果你正在做一个单一的成员或贷款,你不想返回相同的看法。您应该有多个视图。单个贷款的视图将更多地是一个详细信息页面,而不是显示多个贷款的网格。谢谢,我将查看链接。感谢您的帮助谢谢我将查看链接。谢谢你的帮助