0

動的なlinqを使用して、一部のユーザー要求を処理しています。設定方法は、データをVarデータに収集することです。

var data = Project.Model.Adhoc.GetData().AsQueryable();

これは基本的にビューからの選択*です

次に、そこから、ユーザーが選択したフィルター処理が必要なすべてのオプションをループします。

 foreach (Filters filter in filters.OrderBy(x=>x.strOrderNumber))
            {

いくつかのチェックと順列とともに、私はこれに取り掛かります

data = data.Where(filter.strFilter + FormatOperator(filter.strOperator) + "@0", filter.strValue).
                                Select(x => x).ToList().AsQueryable();

これはかなりうまく機能していますが、データソースが増え始めているので、私がやりたいのは次のようなものです。

data = data.select(get all items that were selected)次に、チェックと順列を実行します。これにより、データソース全体ではなく、必要なものだけをプルできるようになります。これを実現するためにlinqを使用するC#の最良の方法は何ですか。

元。

datasource = {Name, Age, Race, Gender, Hair Color, Eye Color, height, weight, etc}

user selected = {Name, Age, Race, Gender}

そのデータソース全体に対してクエリを実行する代わりに、データソースをユーザーがすぐに持ち込んだものだけに制限したいので、それに基づいてデータソースとしてフィルタリングできます。

4

2 に答える 2

0

DynamicLinqを見てください

DynamicQueryライブラリは、任意のLINQデータプロバイダー(LINQ to SQL、LINQ to Objects、LINQ to XML、LINQ to Entities、LINQ to SharePoint、LINQ to TerraServerなど)に対して使用できます。言語演算子またはタイプセーフなラムダ拡張メソッドを使用してLINQクエリを作成する代わりに、動的クエリライブラリは、任意の文字列式を渡すことができる文字列ベースの拡張メソッドを提供します。

于 2012-06-07T19:39:08.543 に答える
0

.ToList()foreach ループ内の呼び出しを削除します。

data = data.Where()sを使用してクエリ式を作成しますAND。したがって、ループの後、最終的に .ToList() を呼び出して、最終的にデータベースにアクセスできます。

アップデート

.Select() は必要ありません。

data = data.Where(filter.strFilter + FormatOperator(filter.strOperator) + "@0", filter.strValue);

Update2

ああ、あなたの質問をもう一度読んだ後、OR を使用してクエリを作成する必要があることがわかりました。

これは、標準ライブラリを使用すると少し難しくなります。追加の依存関係を引き込むことを気にしない場合は、(おそらく) LinqKitを使用して行うことができます

IQueryable<Product> SearchProducts (params string[] keywords)
{
    var predicate = PredicateBuilder.False<Product>();

    foreach (string keyword in keywords)
    {
        string temp = keyword;
        predicate = predicate.Or (p => p.Description.Contains (temp));
    }
    return dataContext.Products.Where (predicate);
}

それが Dynamic Linq とどの程度うまく機能するかはわかりませんが。

それ以外の場合は、式を手作りする必要があり、最終的に次のようになる可能性があります。

public static class IQueryableExtensions
{
    public static IQueryable<T> WhereIn<T, TValue>(
        this IQueryable<T> source,
        Expression<Func<T, TValue>> propertySelector,
        IEnumerable<TValue> values)
    {
        return source.Where(GetWhereInExpression(propertySelector, values));
    }

    private static Expression<Func<T, bool>> GetWhereInExpression<T, TValue>(
        Expression<Func<T, TValue>> propertySelector, IEnumerable<TValue> values)
    {
        if (!values.Any())
            return c => false;

        ParameterExpression p = propertySelector.Parameters.Single();

        // You'll have to adjust this:
        var equals = values.Select(value => (Expression)Expression.Equal(
                propertySelector.Body, Expression.Constant(value, typeof(TValue))));

        var body = equals.Aggregate<Expression>(
                (accumulate, equal) => Expression.Or(accumulate, equal));
        return Expression.Lambda<Func<T, bool>>(body, p);
    }
}
于 2012-06-07T19:38:38.107 に答える