【发布时间】:2015-03-06 18:11:05
【问题描述】:
我对 IQueryable 没有太多经验
我要做的是根据传入的约束列表搜索用户,这些约束可以是用户名,也可以是电话号码。根据我想返回有限信息的类型。然后,我想将 3 个 IQueryables 合并为一个,并将条目与匹配的 id 和用户名结合起来,以维护最多的信息。
这是我目前所拥有的:
public IQueryable<User> Search(String[] criteria)
{
var query = Database.Get<User>();
IQueryable<User> phoneQuery = null;
IQueryable<User> emailQuery = null;
IQueryable<User> nameQuery = null;
foreach (String str in criteria)
{
// Check if it is a phone number
if (Regex.IsMatch(str, @"([0-9]{3})?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$"))
{
phoneQuery = query.Where(
u => u.PhoneNumber.ToLower() == (str))
.Select(i => new User
{
Id = i.Id,
UserName = i.Name,
PhoneNumber = i.PhoneNumber
})
}
// check if it is an email
else if (criteria.Contains("@"))
{
emailQuery = query.Where(
u => u.Email.ToLower() == (str))
.Select(i => new User
{
Id = i.Id,
UserName = i.Name,
Email = i.Email
})
}
else
{
nameQuery = query.Where(
u => u.UserName.ToLower() == (str))
.Select(i => new User
{
Id = i.Id,
UserName = i.Name,
})
}
}
// Merge the 3 queries combining entries if the username and id match and maintain the maximum amount of information
return query;
}
【问题讨论】:
-
我相信与此类似的问题已经有了答案:[如何合并两个 IQueryable 列表][1] [1]:stackoverflow.com/questions/4003813/…
-
为什么不只进行一次查询,检查输入字符串是否匹配电话号码或电子邮件或姓名?
-
我不知道该怎么做的部分是,如果我要合并两个条目,则将列表中的信息保留更多。例如,如果一个用户只有用户名和 id 信息,而另一个用户有用户名 id 和电话号码,我希望返回的用户有用户名 id 和电话号码。
-
你可以在这里简单地使用
IEnumerable<T>,我也强烈建议你不要使用匿名类型。 -
@mbeckish 因为如果他们按用户名搜索,我不想返回电话号码或电子邮件。我只想返回他们实际搜索的信息以及 id 和用户名。