6

私は、そのような大きな検索エンジンを実行するように依頼するプロジェクトを持っていますが、それはすべて動的です。つまり、「OR」または「AND」を使用した「どこで」の無限の可能性を内部に持つメインの「グループ」を 0 ~ 9 個ほど持つことができるということです。最初に考えたのは、動的クエリを作成するための優れた代替手段を提供する Dynamic Linq を使用することでした。これらはすべて自家製のラッパーで EF を使用しています。

問題: 「コレクション」にアクセスできません。つまり、参照されたオブジェクト ( Customer.State.StateName = "New-York" OR Custoemr.State.StateName = "Quebec"など) に簡単にアクセスできますが、次のようなものにアクセスする方法が見つかりません: " Customer.Orders.OrderID = 2 OR Customer.Orders.OrderID = 3" . これはコレクションなので簡単に理解できますが、どうすればよいですか?

私を助けてください!!

**私の英語でごめんなさい!!


アップデート

私は十分にはっきりしていないと思います。申し訳ありませんが、私はフランス人です...

私の問題は、静的なものがないためです。候補者を企業に配置する求人企業の候補者検索エンジンです。マネージャーが候補者を検索できるページで、ドメイン (ジョブ)、都市、またはユーザーが登録時に入力したその他の多くによって「解析」できます。これはすべてフォーマットされています(SQLの場合):

[...] WHERE (domaine.domainID = 3 OR domaine.domainID = 5 OR domaine.domainID = 23) AND (cities.cityID = 4, citys.city = 32) [...]

したがって、次のような通常のLINQ形式ではこれを行うことはできません:

Candidat.Domaines.Where(domain => domain.DomainID == 3 || domain.DomainID == 5 || domain.DomainID == 23);

括弧内の演算子も動的 (「AND」または「OR」) です。そのため、より柔軟な Dynamic Linq を使用しようとしています。

私の問題をより簡単に理解できることを願っています...


更新2 これが私の方法です

private string BuildDomainsWhereClause() {
        StringBuilder theWhere = new StringBuilder();

        if (this.Domaines.NumberOfIDs > 0) {
            theWhere.Append("( ");

            theWhere.Append(string.Format("Domaines.Where( "));
            foreach (int i in this.Domaines.ListOfIDs) {
                if (this.Domaines.ListOfIDs.IndexOf(i) > 0) {
                    theWhere.Append(string.Format(" {0} ", this.DispoJours.AndOr == AndOrEnum.And ? "&&" : "||"));
                }
                theWhere.Append(string.Format("DomaineId == {0}", i));
            }
            theWhere.Append(" ))");
        }

        return theWhere.ToString();
    }

「ブール値を返さない」代わりにうまく機能します。では、どうすればいいですか?エラー : 「型 'Boolean' の式が必要です」。

最後に、「( Domaines.Where( DomaineId == 2 && DomaineId == 3 && DomaineId == 4 && DomaineId == 5 ))」のようなものを返します。私のLINQクエリに追加されます:

var queryWithWhere = from c in m_context.Candidats.Where(WHERE)
                                     select c;

7 つまたは 8 つの「可能な」検索項目が追加されていることを忘れないでください。何かアイデアはありますか?

4

5 に答える 5

5

ここで行う必要があるのは、LambdaExpression (より具体的にはExpression<Func<T, bool>>) を構築することです。文字列は使用できません。次のような単純な式を作成できます。

ParameterExpression p = Expression.Parameter(typeof(Domaine), "domaine");
Expression<Func<Domaine, bool>> wherePredicate = 
  Expression.Lambda<Func<Domaine, bool>>(
    Expression.Or(
      Expression.Equal(
        Expression.Property(p, "DomainID"),
        Expression.Constant(10)),
      Expression.Equal(
        Expression.Property(p, "DomainID"),
        Expression.Constant(11))
      ), p);

つまり、

domaine.DomainID = 10 || domaine.DomainID = 11

これを手動で行う必要がある場合、あまり読みにくくなります。

MSDN Code Gallery のDynamicQueryの下にあるC# Samples for Visual Studio 2008の文字列に基づいて、実際にこれを行う、完全に機能する式パーサーのサンプルがあります。(コントロールは、このサンプルのわずかに変更されたバージョンを内部で使用します。)LinqDataSource

于 2009-08-20T14:50:56.687 に答える
4

最後に、私はそれをまさに私が望む方法で手に入れました。

private string BuildDomainsWhereClause() {
        StringBuilder theWhere = new StringBuilder();

        if (this.Domains.NumberOfIDs > 0) {
            theWhere.Append("( ");

            foreach (int i in this.Domains.ListOfIDs) {
                if (this.Domains.ListOfIDs.IndexOf(i) > 0) {
                    theWhere.Append(string.Format(" {0} ", this.Domains.AndOr == AndOrEnum.And ? "&&" : "||"));
                }
                theWhere.Append(string.Format("Domains.Any(IdDomaine== {0})", i));
            }
            theWhere.Append(" )");
        }

        return theWhere.ToString();
    }

「( DispoJours.Any(IdDispo == 3) && DispoJours.Any(IdDispo == 5) )」のようなものを生成します。

私の他のすべての「Whereビルダー」は、「&&」を使用して同じことを行い、その間に正しい結果が得られます。

以降 :

var queryWithWhere = from c in m_context.Candidats.Where(WHERE)
                     select c;

フーフー!! ありがとうございます。とても役に立ちました!このウェブサイトが大好きです!


アップデート

このクエリで Dynamic Linq を使用していることを忘れないでください。これは通常の LINQ クエリではありません。

于 2009-08-20T15:31:14.890 に答える
0

一歩下がって、顧客が何をしたいのかを尋ねると.

Filter bug information.

データを Excel にエクスポートしたり、Excel を SQL テーブルにポイントしたりしないでください。構築するのはそれほど楽しいものではありませんが、数日または数週間ではなく、数時間で完了します。:)

于 2009-08-20T13:26:34.870 に答える