1

私はEntityFrameworkと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はWCFRIAエンティティです。

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); 

注意すべきことの1つは、Expression e1=Expressionという行です。等しい(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);  

また、前述したように、実際にはカテゴリではなく従業員を使用しています。考え?

エラー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 に答える