使用linq过滤IQueryable列表中的多个列表字段项

时间:2017-11-29 05:40:27

标签: c# asp.net asp.net-mvc linq

我有一个像这样的联系人的课程:

string foundid = "id001"

string foundidvalue = id001.SelectedValue

从我的存储库中我需要过滤具有多个字段和多个值的联系人。我怎么能这样做?我的搜索列表就像这个JSON

public class contacts
{
   public string Name {get;set;}
   public string Mobile {get;set;}
   public string Email {get;set;}
}

调用过滤的更好方法是什么?

2 个答案:

答案 0 :(得分:0)

首先将JSON设置为正确的JSON,因为它看起来不正确。不确定你的前端或后端是否有json。如果它在前端,使用AJAX将其发送到后端并使用newtonsoft json将其转换为列表。然后使用以下查询过滤。

var filtered = allContacts.Where(x=>jsonContacts.Any(y=>y.Name == x.Name || y.Mobile==x.Mobile || y.Email==x.Email));

如果你想过滤一下,找到所有与几个字符相匹配的联系人(%like%),那么使用Contains或Starts with或wild card来查找。

答案 1 :(得分:0)

听起来你正在寻找的是Where()和FirstOrDefault()组合。 这意味着您可以编写一个方法,其中包含两个联系人,一个您正在测试的联系人,以及一个您正在寻找的联系人。

IsMatchingContact(var contactToTest, var contactToFind){
    if(contactToFind.Name != null){
        if(contactToTest.Name != contactToFind.Name){
            return false
        }
    }
    if(contactToFind.Mobile != null){
        if(contactToTest.Mobile != contactToFind.Mobile){
            return false
        }
    }
    if(contactToFind.Email != null){
        if(contactToTest.Email != contactToFind.Email){
            return false
        }
    }
}

我认为上述方法可以更简洁地编写,并且非常感谢人们对更好地利用C#必须实现的好处的任何反馈。

然后将它与实现IEnumerable的任何集合上的Where和FirstOrDefault结合使用,假设您已经使用了JSON并使用它创建了一个对象contactIWantToFind。

collectionOfContacts
    .Where(x => IsMatchingContact(x, contactIWantToFind))
    .FirstOrDefault()

如果您想要返回所有匹配项的集合,请删除FirstOrDefault()方法