【问题标题】:Get Object Property names Dynamically动态获取对象属性名称
【发布时间】:2014-05-12 20:42:10
【问题描述】:

我是 C# 新手,这是我的问题。 我已经让用户从下拉列表中选择他们的搜索选项,并且我在 search 中将 SearchtermSearchBy 作为字符串参数传递> 方法。

(Get() 方法返回 DbSet 个项目)

public virtual IQueryable<Item> Search(string searchTerm, string searchBy)
{
    if (searchBy == "Name")
    {
        var item = Get().Where(i => i.Name.Contains(searchTerm));

        return item;
    }

     if (searchBy == "Category")
    {
        var item = Get().Where(i => i.Category.Contains(searchTerm));
        return item;
    }
}

名称、类别是项目模型的属性。 我想要的是直接使用 searchBy 参数而不是检查 如果 (searchBy=="Name")。 应该和这个差不多。

var item = Get().Where(i => i.searchBy.Contains(searchTerm));

有可能吗?请指教!

【问题讨论】:

  • 为什么如果这里需要,在块代码中是一样的,是吧?
  • 看来这里的逻辑不好是问题所在。
  • 您确定在第二个 if 语句中 where 子句是 i=&gt;i.Name.Contains(searchTerm) 而不是 i=&gt;i.Category.Contains(searchTerm) 吗?
  • 这是可能的,但由于语言的工作方式,它不是很简单。您必须深入研究使用反射和/或表达式树,这对于初学者来说是相当棘手的事情。

标签: c# asp.net-mvc entity-framework


【解决方案1】:

你能试试 linq 动态查询库吗,如 Scott Guthrie 的 blog 中所述:

var item = Get().Where("@0.Contains(@1)", searchBy, searchTerm);

【讨论】:

    【解决方案2】:

    此代码将允许您在对象中动态搜索:

       private static List<T> Search<T>(string searchFor, string searchBy, List<T> searchIn)
        {
             return searchIn.Where(i => i.GetType().GetProperty(searchBy).GetValue(i).ToString().Contains(searchFor)).ToList();    
        }
    

    这里是如何使用它:

    Console.WriteLine(Search<Users>("1", "ID", user).FirstOrDefault().Name);                 Console.ReadLine();
    

    注意现在你不在乎对象是什么...

    see this image

    【讨论】:

    猜你喜欢
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2022-08-23
    相关资源
    最近更新 更多