0

ウェブ上にこれの例がたくさんあることは知っていますが、これを機能させることができないようです。

これを設定してみましょう。値の範囲を制限する必要があるカスタムオブジェクトのリストがあります。

UIでのアクションに基づいて変化する並べ替え変数があり、それに基づいてオブジェクトを別の方法で処理する必要があります。

これが私のオブジェクトです:

MyObject.ID - Just an identifier
MyObject.Cost - The cost of the object.
MyObject.Name - The name of the object.

次に、コストの範囲に基づいてこれをフィルタリングする必要があるため、下の2つのプロパティのいずれかによって制限される可能性があることを考慮して、これに似たものを作成します。

var product = from mo in myobject 
              where mo.Cost <= 10000

また

var product = from mo in myobject
              where mo.Name equals strName

これで、プロジェクトに動的なlinqが含まれていますが、実際に機能させる方法がわかりません。たとえば、取得している例のいくつかを実行すると、次のようになります。

Func<Tsourse>bool> predicate

オプションとして。

更新: 現在、linqクエリのコピーと貼り付けが多いため、コードをオブジェクト化するのに役立つソリューションを見つけようとしています。

更新2: 次の間に明らかなパフォーマンスの違いがありますか?

var product = from mo in myobject 
... a few joins ...
where mo.Cost <= 10000

var product = (from mo in myobject 
... a few joins ...)
.AsQueryable()
.Where("Cost > 1000")
4

3 に答える 3

2

質問に直接答えないかもしれませんが、ここではDynamicQueryは不要です。このクエリは次のように記述できます。

public IEnumerable<MyObject> GetMyObjects(int? maxCost, string name)
{
    var query = context.MyObjects;
    if (maxCost != null)
    {
        query = query.Where(mo => mo.Cost <= (int)maxCost);
    }
    if (!string.IsNullOrEmpty(name))
    {
        query = query.Where(mo => mo.Name == name);
    }
    return query;
}

条件が相互に排他的である場合は、2番目ifを。に変更するだけelse ifです。

私はいつもこのパターンを使っています。「動的クエリ」が実際に意味するのは、純粋なSQLとLinqを組み合わせることです。その場で条件を生成することは、それほど役に立ちません。

于 2010-01-08T15:29:53.027 に答える
1

ScottGuによるDLINQのこの素晴らしい投稿を読んでください

動的LINQ(パート1:LINQ動的クエリライブラリの使用)

あなたは次のようなものが必要になります

var product = myobject.Where("Cost <= 10000");
var product = myobject.Where("Name = @0", strName);

Dynamic.csサンプルをダウンロードした場合は、サンプル内のファイルを見つける必要があります。このファイルをプロジェクトにコピーして using System.Linq.Dynamic;から、でDynamicLinqを使用しようとしているクラスに追加する必要があります。

編集:あなたの編集に答えるため。はい、もちろんパフォーマンスの違いがあります。フィルタのバリエーションを事前に知っている場合は、DLINQを使用せずにそれらを書き出すことをお勧めします。

このように独自の拡張メソッドを作成できます。

 public static class FilterExtensions
    {
        public static IEnumerable<T> AddFilter<T,T1>(this IEnumerable<T> list, Func<T,T1, bool> filter,  T1 argument )
        {
            return list.Where(foo => filter(foo, argument) );
        }
    }

次に、フィルターメソッドを作成します。

        public bool FilterById(Foo obj, int id)
        {
            return obj.id == id;
        }

        public bool FilterByName(Foo obj, string name)
        {
            return obj.name == name;
        }

IEnumerable<Foo>これで、これを非常に簡単に使用できます。

    List<Foo> foos = new List<Foo>();
    foos.Add(new Foo() { id = 1, name = "test" });
    foos.Add(new Foo() { id = 1, name = "test1" });
    foos.Add(new Foo() { id = 2, name = "test2" });

    //Example 1
    //get all Foos's by Id == 1
    var list1 = foos.AddFilter(FilterById, 1);

    //Example 2
    //get all Foo's by name ==  "test1"
    var list2 = foos.AddFilter(FilterByName, "test1");

    //Example 3
   //get all Foo's by Id and Name
   var list1 = foos.AddFilter(FilterById, 1).AddFilter(FilterByName, "test1");
于 2010-01-08T15:10:54.487 に答える
1
using System.Linq;

var products = mo.Where(x => x.Name == "xyz");

var products = mo.Where(x => x.Cost <= 1000);

var products = mo.Where(x => x.Name == "xyz" || x.Cost <= 1000);
于 2010-01-08T15:31:29.017 に答える