1

我正在使用 Entity Framework 和 Silverlight (RIA),并正在考虑创建一个函数来扩展 CRUD,以允许用户指定特定的列名,然后指定一个匹配的值来查明准确的记录......代码看起来像这样......

public IQueryable<Category> GetCategory(string theColumn, string theCriteria)
{
      return this.ObjectContext.Categories
                .Where(c => c.theColumn = theCriteria);
}

获取所有类别的类似工作功能......(通过关联数据模型后构建创建)

    public IQueryable<Category> GetCategories()
    {
        return this.ObjectContext.Categories;
    }

提前致谢!

4

3 回答 3

1

我不知道这是否解决了您的问题或仅移动了它,但您可以将谓词委托给这样的方法的客户端

public IQueryable<Category> GetCategory(Func<Category, IQueryable<Category>> predicate)
{
      return this.ObjectContext.Categories.Where(predicate);
}

那么你可以通过这种方式调用这个方法

GetCategory(c => c.column=criteria)
于 2012-06-28T15:44:04.710 回答
1

我已经构建了类似于您要构建的东西。我使用 System.Linq.Expressions 中的表达式树进行构建。因此,我建议您使用表达式树构建您的 where 谓词,其中谓词的签名为 Expression<Func<T,bool>>.

下面的一些伪代码,其中 T 是 WCF RIA 实体:

public static class QueryHelper
{
  public static Expression<Func<T, bool>> ToPredicate<T> ( string propertyName, dynamic criteria )
    {
        ParameterExpression pe = Expression.Parameter( typeof( T ), "t" );
        Expression np = Expression.Property( pe, propertyName );
        ConstantExpression value = Expression.Constant( criteria );

        Expression e1 = Expression.Equal( np, value );

        var filter = Expression.Lambda<Func<T, bool>>( e1, pe );

        return filter;
    }
}

然后可以像这样使用:

var selector = QueryHelper.ToPredicate<Category>("theColumn", "hello");
return this.ObjectContext.Categories.Where(selector);     

LoadOperation<Employee> loader = context.Load( context.GetEmployeesQuery()
                                        .Where( selector ) );
loader.Completed += (op) =>
  {
    if ( !op.HasErrors)
    {
    }
  };

或者

var selector = QueryHelper.ToPredicate<Category>("theColumn", true);
return this.ObjectContext.Categories.Where(selector); 

需要注意的一点是表达式 e1 = 表达式。相等(np,值);在函数中。您可以将此函数扩展为 >、<、=> 等,但您需要检查您使用的属性类型是否支持该运算符。

希望这可以帮助。

于 2012-07-02T17:12:49.600 回答
0

我像这样初始化我的上下文......

    NorthwindDomainContext context = new NorthwindDomainContext();

我这样称呼你的方法......

var selector = QueryHelper.ToPredicate<Employee>("theColumn", "hello");
        return this.context.Employees.Where(selector);  

另外,正如我所指出的,我实际上使用的是 Employee 而不是 Category。想法?

错误 1 ​​参数 2:无法从 'System.Linq.Expressions.Expression>' 转换为 'System.Func' C:\Code\NorthwindRIA\NorthwindRIA\Views\Employee.xaml.cs 22 49 NorthwindRIA

错误 2 'System.ServiceModel.DomainServices.Client.EntitySet' 不包含 'Where' 的定义和最佳扩展方法重载 'System.Linq.Queryable.Where(System.Linq.IQueryable, System.Linq.Expressions.Expression >)' 有一些无效参数 C:\Code\NorthwindRIA\NorthwindRIA\Views\Employee.xaml.cs 22 20 NorthwindRIA

错误 3 实例参数:无法从 'System.ServiceModel.DomainServices.Client.EntitySet' 转换为 'System.Linq.IQueryable' C:\Code\NorthwindRIA\NorthwindRIA\Views\Employee.xaml.cs 22 20 NorthwindRIA

于 2012-07-18T14:21:46.217 回答