我在下面有一段代码可以正常工作,但我想要其他东西得到结果。 此代码显示数据库表中与搜索条件匹配的第一行。
userName tbl = new userName();
bool flag = db.userName.Where(x => x.name == txtName.Text || x.City==txtCity.Text).Any();
if (flag)
{
tbl = db.userName.Where(x => x.name == txtName.Text || x.City==txtCity.Text).First();
userNameBindingSource.DataSource = tbl;
}
else
{
MessageBox.Show("This record does not exist in the database.", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
但是,如果我有多个符合搜索条件的行,该怎么办?我想在结果列表中显示所有这些,而不仅仅是符合条件的第一个。
我试过这个,但出了点问题:
tbl = db.userName.Where(x => x.name == txtName.Text || x.City==txtCity.Text).All();
我应该如何优化上面的代码来实现这个目标?
答案 0 :(得分:3)
如果要返回项目列表,可以在查询结束时使用LINQ .ToList()。
List<UserName> tbl = db.UserNames.Where(x => x.Name == txtName.Text || x.City == txtCity.Text).ToList();
这将评估您使用DBContext构建的IQueryable。 ToList将返回您的实体列表。您也可以使用ToArray:)
.All()用于验证枚举中与您的表达式匹配的所有项目。例如:
.All(x=> x.Contains("text")).
答案 1 :(得分:2)
改变这个:
tbl = db.userName.Where(x => x.name == txtName.Text || x.City==txtCity.Text).First();
到此:
var items = db.userName.Where(x => x.name == txtName.Text || x.City==txtCity.Text).ToList();
使用'var'只意味着系统会通过暗示使用来评估最佳类型。除非你想要一个特定的,大部分时间不再需要。
所有这一切:
bool flag = db.userName.Where(x => x.name == txtName.Text || x.City==txtCity.Text).Any();
if (flag)
{
// code...
}
是完全不需要的,因为大多数关于LINQ的好东西是你可以直接与.Where,.Any,.Exists,.Contains等直接内联的大部分谓词用法...然后你只需链接到更多扩展方法如:
context.(tableOrObject)
.Where(x => x.Prop == (somePredicate))
.Select(x => new { Id = x.Id, Desc = (some series of things)})
.ToList();
当您执行类似.First,.Single,.FirstOrDefault等操作时......您将收集限制为单次返回。 .ToList()或.ToArray()更常用于将数据实现到集合返回中。