搜索查询数据库先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);
它还能提高你的表现。
我想创建一个搜索按钮,使用户能够搜索成员并加载相关详细信息。我也在使用 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);
它还能提高你的表现。