【问题标题】:Filter multiple list field items in IQueryable list using linq使用 linq 过滤 IQueryable 列表中的多个列表字段项
【发布时间】:2017-11-29 05:40:27
【问题描述】:

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

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

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

[
  { “Name”, “Alan”, “Mobile ” : “0000000000”},
  { “Name”, “Milan”, “Mobile” : “0000000001”, “Email ” : “test@test.com” }
]

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

【问题讨论】:

  • 不清楚您要过滤的内容(这不是有效的 json)
  • 我需要用这个json值一次性过滤存储库中的联系人列表,json可能会根据请求而改变
  • “Name”, “Alan”,似乎是不正确的json,最好写一个contactfilter之类的类并反序列化你的json以填充contactfilter列表,然后你可以在linq中使用它。
  • 正如我所指出的,它甚至无效(它需要是 "Name": "Alan" 等)。您是否想通过Name="Alan" && Mobile="0000000000" Name="Milan" && Mobile="0000000001" && Email="test@test.com" 获取所有记录。那个 json 是从哪里来的,你要转换成对象的集合吗?

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


【解决方案1】:

首先将 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%),然后使用包含或开头或通配符来查找。

【讨论】:

    【解决方案2】:

    听起来您正在寻找的是 Where() 和 FirstOrDefault() 组合。 这意味着您可以编写一个方法来获取两个联系人,一个是您正在测试的,一个是您正在寻找的。​​p>

    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() 方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-27
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多