在类属性列表中搜索,其中等于属性集值

时间:2016-09-21 08:57:13

标签: c# linq

我尝试获取myClass的新列表,其中的属性等于虚拟类属性集。我不知道我怎么写一个linq表达式可以做到这一点。 特别是列表来自EntityFramework,所以如果没有必要,我不想一次性提取所有数据。

像:

public class MyClass
    {
        public int MyInt { get; set; }
        public string MyString { get; set; }
        public bool MyBool { get; set; }
        public DateTime MyDate { get; set; }
    }

    public List<MyClass> myClassList = new List<MyClass>();

    /// <summary>
    /// 
    /// </summary>
    /// <param name="myClass">A Dummy Class where stored the searched values</param>
    /// <param name="searchingPropertiesName">a string array where stored the searched property names</param>
    public void MySearch(MyClass myClass, string[] searchingPropertiesName)
    {
        var propInfo = new List<System.Reflection.PropertyInfo>();

        foreach (System.Reflection.PropertyInfo myClassProp in typeof(MyClass).GetProperties(System.Reflection.BindingFlags.Public))
        {
            foreach (string searchPropName in searchingPropertiesName)
            {
                if (myClassProp.Name != searchPropName)
                {
                    return;
                }

                propInfo.Add(typeof(EventSeries).GetProperty(searchPropName));
            }
        }


        var searchedList = myClassList.Where(e => e... "e.Property values are equal propInfo.values");
    }

谢谢!

1 个答案:

答案 0 :(得分:0)

我在下面写的这个版本只能在Linq-to-Objects中正常使用。虽然这是一个有趣的学术问题,但你不应该在生产中使用这种方法。您对使用原型值和命名属性列表的动态谓词的想法不会转换为Linq-to-Entities(它不会生成良好的SQL)。我建议您动态构建一个查询(使用IQueryable.Where,然后查找LinqKit)。

private static readonly Dictionary<String,PropertyInfo> _properties = typeof(MyClass).GetProperties().ToDictionary( pi => pi.Name );

public IEnumerable<MyClass>Search(MyClass prototype, IEnumerable<String> propertiesToFilter, IEnumerable<MyClass> items) {

    IEnumerable<PropertyInfo> selectedProperties = propertiesToFilter
        .Select( name => _properties[ name ] )
        .ToList();

    return items
        .Where( i => selectedProperties
            .Select( pi => pi.GetValue( i )
            .SequenceEquals( _selectedProperties
                .Select( pi => pi.GetValue( prototype ) )
        );
}