我尝试获取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");
}
谢谢!
答案 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 ) )
);
}