2017-04-10 75 views
1

我有一段代码在下面,它工作正常,但我想要别的东西得到结果。 此代码显示数据库表中与搜索条件匹配的第一行。在C#中使用Entity Framework搜索数据库

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

我应该如何改进上面的代码来实现这一目标?

回答

3

如果您想要取回项目列表,您可以在查询结束时使用LINQ .ToList()。

List<UserName> tbl = db.UserNames.Where(x => x.Name == txtName.Text || x.City == txtCity.Text).ToList(); 

这将评估你的IQueryable你建立具有的DbContext。 ToList将返回您的实体列表。您也可以使用ToArray :)

。所有()用于验证您的枚举中与您的表达式匹配的所有项目。例如:

.All(x=> x.Contains("text")). 
+0

小记:'tbl'是'userName',而不是'List '。 – msitt

+0

小记:您应该考虑不区分大小写的可能性 –

+0

非常感谢您的快速回复。有用。这就是我想要得到的。 – Laki

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

使用 '变种' 只是意味着该系统将通过暗示的使用评估的最佳类型。除非你想发出一个特定的,大部分时间不再需要。

所有这一切:

bool flag = db.userName.Where(x => x.name == txtName.Text || x.City==txtCity.Text).Any(); 

if (flag) 
{ 
// code... 
} 

是作为很不错关于LINQ是你可以用。凡,。任何,.Exists,做。载最谓语使用直接内嵌大多数事情完全不必要的,等等......然后你只是连锁关闭的与更多的扩展方法是这样的:

context.(tableOrObject) 
    .Where(x => x.Prop == (somePredicate)) 
    .Select(x => new { Id = x.Id, Desc = (some series of things)}) 
    .ToList(); 

当你做的东西like.First,。单,.FirstOrDefault,等等......你是限制你的收藏到单一回报。 .ToList()或.ToArray()更常用于将数据实现为集合返回。

+0

非常感谢您的解释。你的解决方案也可以。 我使用if语句来检查是否有任何符合搜索条件的记录,并且如果不显示警告消息。 – Laki

相关问题