【发布时间】:2013-11-20 01:12:25
【问题描述】:
我创建了一个类来帮助构建 Where 子句的集合,然后创建了一个在使用 Entity Framework 6 代码优先项目中的存储库模式构建查询时应用它们的方法。 Apply 方法的 Equal、NotEqual 和 Contains 部分都可以正常工作。
我的问题或问题是如何将大于和小于子句应用于具有此类实现类型的查询?我让他们在下面对它通常如何为 Linq 查询进行编码,但显然“a”和字段值存在错误。我确实有一个关于类实例化的 TProperty,它应该能够检查并用于转换 FieldValue,因为您不能对某些数据类型使用运算符“>”或“
这是接受通用对象类型和通用属性类型的类。它有一个构造函数,用于创建新实例并在存储中保存多个属性。然后将该列表传递给存储库类,该存储库类循环遍历它们并调用 ApplyWhere 方法以应用于查询。
public class WhereClause<T, TProperty> : IWhereClause<T> where T : class, new()
{
private string FieldName { get; set; }
private object FieldValue { get; set; }
private Enums.WhereOperation WhereOperation { get; set; }
public WhereClause(string fieldName, object fieldValue, Enums.WhereOperation whereOperation)
{
this.FieldName = fieldName;
this.FieldValue = fieldValue;
this.WhereOperation = whereOperation;
}
public IQueryable<T> ApplyWhere(IQueryable<T> query)
{
switch ((int)this.WhereOperation)
{
case (int)Enums.WhereOperation.Equal:
return query.WhereEqual(this.FieldName, this.FieldValue);
case (int)Enums.WhereOperation.NotEqual:
return query.WhereNotEqual(this.FieldName, this.FieldValue);
case (int)Enums.WhereOperation.Contains:
return query.WhereContains(this.FieldName, this.FieldValue);
**case (int)Enums.WhereOperation.GreaterThan:
return query.Where(a => a > this.FieldValue);
case (int)Enums.WhereOperation.LessThan:
return query.Where(a => a < this.FieldValue);**
}
return query;
}
}
以下是我如何构建 Where 子句列表以传递到存储库:
IWhereClause<Schema.Model.Product>[] whereClause = new IWhereClause<Schema.Model.Product>[1];
whereClause[0] = new WhereClause<Schema.Model.Product, string>("SKU", "BKL-14244", Enums.WhereOperation.Equal);
这是存储库 Select 方法中的一个 sn-p,它为 IQueryable 查询构建 where 子句:
if (whereClause != null)
{
whereClause.ToList().ForEach(one =>
{
query = one.ApplyWhere(query);
});
}
【问题讨论】:
-
您可能想看看PredicateBuilder of LINQKit。
-
请展示 WhereNotEqual 和 WhereContains 方法
标签: .net linq entity-framework c#-4.0 repository-pattern