locked
DomainDataSource + QueryParameterを使用した際のDomainServiceの実装方法について RRS feed

  • 質問

  • お世話になります。

    以下の実装方法しか無いでしょうか?

    この方法だと引数が増えるたびにIF文を作成をしないといけないので大変です。。。

    シンプルな方法をご教授下さい。

     

    public IQueryable<TEST> GetTESTs(string strNameA,
                                     string strNameB)
    {
        string strWorkNameA;
        if (strNameA == null)
        {
            strWorkNameA = "";
        }
        else
        {
            strWorkNameA = strNameA.Trim();
        }

        string strWorkNameB;
        if (strNameB == null)
        {
            strWorkNameB = "";
        }
        else
        {
            strWorkNameB = strNameB.Trim();
        }

        if ((strWorkNameA == "")
            && (strWorkNameB == ""))
        {
            return this.DataContext.TESTs;
        }
        else if ((strWorkNameA != "")
            && (strWorkNameB == ""))
        {
            return this.DataContext.TESTs.Where(e => e.NAMEA == strWorkNameA);
        }
        else if ((strWorkNameA == "")
            && (strWorkNameB != ""))
        {
            return this.DataContext.TESTs.Where(e => e.NAMEB == strWorkNameB);
        }
        else
        {
            return this.DataContext.TESTs.Where(e => e.NAMEA == strWorkNameA
                                                            && e.NAMEB == strWorkNameB);
        }
    }

    2010年12月20日 12:03

回答

  • ビジネスロジックがどうなっているかですが、たぶん引数が増えるたびに分岐が増えるのはしょうがないんじゃないでしょうか。

    単純に今回のロジックだけみてLINQを組み替えるとしたら、こんな感じ?(動作保証なし)

    this.DataContext.TESTs
      .Where(e => e.NAMEA == strNameA == null ? e.NAMEA: strNameA.Trim())
      .Where(e => e.NAMEB == strNameB == null ? e.NAMEB: strNameB.Trim())
    

    ただこれが効率的なクエリになっているかどうかは別の話。

    • 回答としてマーク 山本春海 2011年2月10日 6:54
    2010年12月21日 1:02