![](/img/trans.png)
[英]Linq dynamic expression for filtering navigation properties and collections
[英]Dynamic linq expression for filtering with enum collection
public enum StoreType {
Children = 1,
Adult = 2,
Farm = 3
}
如果我有這些的集合:
List<StoreType> enumCollection = new List<StoreType>{ StoreType.Children, StoreType.Farm };
我想構建動態的linq表達式,以便可以遍歷枚舉類型以基於這些枚舉過濾結果?
我想要實現的偽代碼:
var enumFilter = LinqExpressionHelper.BuildEnumFilter(enumCollection);
_storeRepository.GetStores.Where(enumFilter).ToList();
如何構建動態linq表達式,以便可以按枚舉集合進行過濾?
您可以在列表上執行“ Contains
”:
_storeRepository.GetStores.Where(store => enumCollection.Contains(store.Type)).ToList();
不確定我了解你想要什么
List<StoreType> filters = new List<StoreType> { StoreType.Children, StoreType.Farm };
List<int> lstTofilter = new List<int>() { 1, 2, 3, 4, 5 };
var filteredList = lstTofilter.Where(i => !filters.Any(e => i.Equals((int)e))); //2, 4, 5
記住將枚舉轉換為整數以獲取其值
我認為這是您想要的:
static class Program
{
private static void Main(string[] args)
{
var enumCollection = new List<StoreType> { StoreType.Children, StoreType.Farm };
var repo = new StoreRepository();
var enumFilter = LinqExpressionHelper.BuildEnumFilter(enumCollection);
var result = repo.GetStores().Where(enumFilter).ToList();
foreach (var store in result)
Console.WriteLine($"Name={store.Name}, Type={store.StoreType}");
Console.ReadKey();
}
}
public enum StoreType
{
Children = 1,
Adult = 2,
Farm = 3
}
public class StoreRepository
{
public IEnumerable<Store> GetStores()
{
return new List<Store>
{
new Store {Name = "NewYork", StoreType = StoreType.Adult},
new Store {Name = "RioDeJaneiro", StoreType = StoreType.Farm},
new Store {Name = "Budapest", StoreType = StoreType.Children}
};
}
}
public class Store
{
public string Name { get; set; }
public StoreType StoreType { get; set; }
}
public static class LinqExpressionHelper
{
public static Func<Store, bool> BuildEnumFilter(IEnumerable<StoreType> storeTypes)
{
return store => storeTypes.Contains(store.StoreType);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.