我有一个Entity Framework类设置为从SQL数据库中读取表,但我无法弄清楚如何传递LINQ表达式来仅过滤某些对象。我知道有一种方法可以构建一个表达式树,并在类中动态地执行此操作,但我似乎无法找到最佳方法。
任何提示都表示赞赏。
class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
class MyObjectCollection<T> where T : class
{
private List<T> myInternalCollection = new List<T>();
MyObjectCollection()
{
using (var db = new MyContext())
{
foreach (T row in db.Set<T>())
{
// Enumerate the data, do whatever with it...
myInternalCollection.Add(row);
}
}
}
MyObjectCollection(var MyLinqExpression)
{
using (var db = new MyContext())
{
foreach (T row in db.Set<T>().Where.MyLinqExpression()
{
// Enumerate the data, do whatever with it...
myInternalCollection.Add(row);
}
}
}
}
// Works fine:
MyObjectCollection<Customer> allCustomers = new MyObjectCollection<Customer>();
// Would like something like this:
MyObjectCollection<Customer> customersP = new MyObjectCollection<Customer>(c => c.StartsWith("P"));
答案 0 :(得分:2)
Linq Where方法采用Func<T, bool>
参数,其中T将是您要应用Where方法的dbSet对象类型。
为了使您的代码有效,您可以这样做:
public MyObjectCollection(Func<T, bool> MyLinqExpression)
{
using (var db = new MyContext())
{
foreach (T row in db.Set<T>().Where(MyLinqExpression))
{
// Enumerate the data, do whatever with it...
myInternalCollection.Add(row);
}
}
}
更新:
此外,要使用泛型集合实现您正在寻找的功能,而不是封装私有List对象,您可以从List继承,如下所示。因此,如果您希望MyObjectCollection
像List一样运行,您可以执行类似我在下面显示的操作。
因此,使用上面的代码,您可以更改为:
public class MyObjectCollection<T> : List<T> where T : class
{
public MyObjectCollection()
{
using (var db = new MyContext())
{
foreach (T row in db.Set<T>())
{
// Enumerate the data, do whatever with it...
this.Add(row);
}
}
}
public MyObjectCollection(Func<T, bool> MyLinqExpression)
{
using (var db = new MyContext())
{
foreach (T row in db.Set<T>().Where(MyLinqExpression))
{
// Enumerate the data, do whatever with it...
this.Add(row);
}
}
}
}