至少我找到了解决我的问题的方法 - 但我非常感谢提示和/或使它变得更好的方法,因为我无法想象这是圣杯,甚至接近.. .
但是,第一步是我的加入,我以 IQueryable 的形式返回。重要提示:此处不要使用,否则 dbContext 将被释放,这在使用 IQueryable 时不太好:
private static MyDbContext _dbContext;
private static IQueryable<DenormalizedType> SelectType()
{
_dbContext = new MyDbContext();
var myData = (from some in dbContext.Thing
join other in dbContext.OtherThing
on some.OtherId equals other.Id
select new DenormalizedType()
{
SomeEntry = some.Entry
SomeOtherId = some.OtherId
OtherValue = other.Value
};
return myData;
}
我今天学到了很多。例如:IEnumerable 和 IQueryable 都有一个扩展方法.Where()。但只有IEnumerable.Where() 有Func<T,bool> 作为参数。 IQueryable 将Expression<Func<T,bool>> 用作其Where()。如果我希望我的查询被执行,我需要在所有条件下使用 IQueryable 类型,只要我的所有 where 都没有执行。所以我需要仔细研究一下Expression-Type。我不明白这一切实际上做了什么,但它确实有效;)
我必须做的第一件事就是编写我的 Where-Methods。在我读完这篇文章后,这很容易:Entity Framework Filter "Expression<Func<T, bool>>"。方法如下所示:
public static IQueryable<DenormalizedType> SelectWhereCriteria(IQueryable<DenormalizedType> data, Expression<Func<DenormalizedType, bool>> predicate)
{
return data.Where(predicate);
}
表达式本身有点复杂,因为我有一个 Selection-Enum 应该选择指定的过滤器。表达式看起来像:
Expression<Func<DenormalizedType, bool>> FilterBySelection(Selection selection)
{
switch(selection)
{
case Selection.Active:
return x => x.IsActive == true;
case Selection.InActive:
return x => x.IsActive == false;
case Selection.SomeOtherSelection:
return x => x.SomeOther == "Criteria"
default:
return x => true;
}
}
这个表达式在我的 IQueryable 上运行良好:
var selectedQuery = DataHandler.SelectWhereCriteria(query, FilterBySelection(selection));
我现在唯一需要的就是订购。我从 MarcGravell(顺便说一句,真是个天才)Dynamic LINQ OrderBy on IEnumerable<T> 那里找到了一些非常酷的东西,他在其中将一些代码作为答案发布给 OrderBy PropertyName,您可以使用这些代码。他的第一段代码采用 IQueryable,按 PropertyName 对其进行排序(他还提供了 Descending OrderyBy 的扩展)并返回一个 IOrderedQueryable。 ToList()-Operation 是我执行的最后一个操作。
还有一件事:不要忘记 Dispose DbContext:
public static void Dispose()
{
_dbContext.Dispose();
}