如何使用linq从表中搜索任何属性?

Cod*_*323 6 .net c# linq

我需要搜索dblinq表,以便在任何字段与搜索输入匹配时函数应返回行列表.

它与谷歌搜索更相似,您可以使用任何关键字进行搜索,并显示匹配文档列表.

我用反射技术.您能否检查一下这种方法是否正确或是否有任何简单的方法来实现这一目的?

我已经获得了dblinq表行的所有属性,并比较了它的字符串类型,然后检查了该值.

我用过的代码

  public static List<Contacts> SearchContact(string searchText)
    {

        List<Contacts> list = new List<Contacts>();
        try
        {
            var rows= from p in context.tblContacts select p;

            foreach (var contact in rows)
            {
                Type type = contact.GetType();
                Type typesearch = searchText.GetType();
                PropertyInfo[] properties = type.GetProperties();
                foreach (PropertyInfo pro in properties)
                {
                    if (pro.PropertyType == typesearch)
                    {

                        var value = pro.GetValue(contact, null);
                        string val = value as string;

                            if (val != null && val == searchText)
                            {
                                list.Add(contact);
                                break;
                            }

                    }
                }
            }
        }
        catch (Exception ex)
        {
        }
        return list;
    }
Run Code Online (Sandbox Code Playgroud)

PS:我从这种方法得到预期的输出,但我想知道我是否还有其他方法.

Zeb*_*ebi 2

我没有 Visual Studio 来手动测试它,但这也应该有效:

var contactProperties = typeof(Contact).GetProperties()
                               .Where(x => x.PropertyType == typeof(string))
                               .ToArray();

from contact in context.tblContacts
from property in contactProperties
let value = property.GetValue(contact, null) as string
where value == searchText
select contact
Run Code Online (Sandbox Code Playgroud)

我只会获得一次属性,因为每次都是一样的。

关于您是否使用反射的问题..这取决于。如果您的Contact类型只有几个(2-5)个字符串属性,我将手动实现此方法,而不是使用反射。这可能有点乏味,但在可读性、速度方面是值得的(但不应有显着差异),并且您可以控制比较哪些属性(也许您的联系人包含不应搜索的字符串属性)。

如果您计划扩展/更改类型Contact或必须检查大量属性,我会进行反射。