我正试图找出一种搜索用户联系方式的方法。
用户可以拥有多个联系人
这是我的代码:
_usersRep.Find(r=>(string.IsNullOrEmpty(vm.PhoneNumber)
|| r.UserContacts
.Select(o => o.TelephoneNo)
.Contains(vm.PhoneNumber))
这应该让用户知道它的任何联系人都包含我传递给它的PhoneNumber。我实际上试图找到它应该相等的地方,但我无法让它发挥作用。
我已经在数据库中检查过该用户有一个联系对象,并且该对象电话号码是我搜索的那个,但它不会给我带来用户。
User
和UserContacts
之间的关系是一对多。
如果文字为空,我还想忽略搜索过滤器?但是当我没有输入任何内容时,它会给我带来所有用户。
答案 0 :(得分:3)
我认为你正在寻找类似的东西:
_usersRep.Where(r => r.UserContacts.Any(uc => uc.TelephoneNo == vm.PhoneNumber))
根据用户是否具有匹配编号的任何用户联系,限制返回哪些用户(Where子句)。
编辑多个条件:
_usersRep.Where(r => r.UserContacts.Any(uc => uc.TelephoneNo == vm.PhoneNumber &&
uc.EmailAddress == vm.EmailAddress)) // etc
所以逻辑是,对于我们测试的每个UserContact,如果lambda表达式中的所有条件都为真,那么它传递谓词,在这种情况下,当我们使用Any测试时,选择userRep。希望这是有道理的!
确定所以,如果某些字段可以合法地为空,我们应该确保在我们进行比较时定义过滤器,因此在一些嵌套ORs
中组合起作用: / p>
_usersRep.Where(r => r.UserContacts.Any(uc =>
(String.IsNullOrEmpty(vm.PhoneNumber) || uc.TelephoneNo == vm.PhoneNumber) &&
(String.IsNullOrEmpty(vm.EmailAddress) || uc.EmailAddress == vm.EmailAddress)))
请注意,如果vm中的所有字段为空,则会返回所有内容,因为没有限制。如果你不想这样,你应该在调用此查询之前检查。
<强>解释强>
只是要明确这是如何工作的。如果我们对每个字段采用基本条款:
(String.IsNullOrEmpty(vm.PhoneNumber) || uc.TelephoneNo == vm.PhoneNumber)
我们说的是,部分A
或B
是否为真,那么此字段的 我们有匹配。请注意,||
运算符首先评估A
,仅在B
为false时评估A
。所以,用简单的英语,如果String.IsNullOrEmpty(vm.PhoneNumber)
是true
(即如果用户没有为此字段输入查询文本)那么它就是匹配,无论PhoneNumber
实际上是什么是。因此,我们只在为uc.TelephoneNo == vm.PhoneNumber
vm.PhoneNumber
因此,上面确定对于单个字段我们有匹配(因为用户没有输入该字段的查询,或者因为他们这样做,并且字符串匹配)。现在我们使用&&
来确保我们检查的每个字段都是基于上述测试的匹配。
现在因为我们首先对我们过滤器中的每个字段String.IsNullOrEmpty
进行操作,如果每个字段都是如此,基于上述逻辑,一切都是匹配的。这也具有语义意义 - 如果您没有输入任何条款来限制搜索,您可能会收到所有内容。
如果上述情况出现问题,正如我之前所说,在执行查询之前我会检查这个问题,并告诉用户他们必须输入至少一个搜索字词来限制搜索范围。
答案 1 :(得分:0)
假设vm.PhoneNumber
是您的搜索过滤器,将!
添加到String.IsNullOrEmpty
检查并将||
更改为&&
_usersRep.Find(r=>(!string.IsNullOrEmpty(vm.PhoneNumber)
&& r.UserContacts
.Select(o => o.TelephoneNo)
.Contains(vm.PhoneNumber))
答案 2 :(得分:0)
当搜索字符串是由于此
时,您获得所有用户的原因_usersRep.Find(r=>(string.IsNullOrEmpty(vm.PhoneNumber) || ... )
如果电话号码字符串为空或空,则查找将始终返回true,为您提供所有用户
你想要
if(!string.IsNullOrEmpty(vm.PhoneNumber))
_usersRep.Find(r=> ... )
对于其他问题,请尝试修剪字符串
if(!string.IsNullOrEmpty(vm.PhoneNumber))
_usersRep.Find(r=>r.UserContacts
.Select(o => o.TelephoneNo)
.Contains(vm.PhoneNumber.Trim()))
除了这些更改之外,没有注意到任何其他应该给你带来问题的信息。