使用C#中的Entity Framework搜索数据库

时间:2017-04-10 14:49:22

标签: c# entity-framework lambda

我在下面有一段代码可以正常工作,但我想要其他东西得到结果。 此代码显示数据库表中与搜索条件匹配的第一行。

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

我应该如何优化上面的代码来实现这个目标?

2 个答案:

答案 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()更常用于将数据实现到集合返回中。