0
public GetApplicants(string Office,
                         int Id,
                         List<int> cfrparts,
                         List<int> expertiseAreaIds,
                         List<int> authIds,
                         List<int> specIds)
    {
        bool isAuthIdsNull = authIds == null;
        authIds = authIds ?? new List<int>();
        bool isSpecIdNull = specIds == null;

enter code here
     var query =
            from application in Apps
            from cfr in application.cfr
            from exp in cfr.Aoe
           from auth in exp.Auth
            from spec in exp.Special

            where application.Design.Id == 14
            where  (iscfrpart || cfrPartIds.Contains(cfr.CfrP.Id))
            where (isexp || expertiseAreaIds.Contains(exp.Aoe.Id))
            where (isAuthIdsNull || authIds.Contains(auth.Auth.Id))
            where  (isSpecIdNull || specIds.Contains(spec.Special.Id))
            where application.Office.Text.Contains(Office)
            where application.D.Id == Id

            select application.Id;

このクエリを動的にするにはどうすればよいですか。Id と Office の値しかない場合でも、利用可能な値に基づいて結果セットが得られるはずです。Curentlyその結果が得られません。

4

2 に答える 2

1

を複数回呼び出す代わりにwhere&&

 var query =
        from Apps
        where (iscfrpart || cfrPartIds.Contains(Apps.cfr.CfrP.Id))
        && (isexp || expertiseAreaIds.Contains(Apps.cfr.Aoe.Id))
        && (isAuthIdsNull || authIds.Contains(Apps.cfr.Aoe.Auth.Id))
        && (isSpecIdNull || specIds.Contains(Apps.cfr.Aoe.Special.Id))
        && Apps.Office.Text.Contains(Office)
        && Apps.D.Id == Id

        select application.Id;

さらに、この句は、渡された Id が 14 と等しくない場合、この句application.D.Id == 14と組み合わせると 0 の結果になります。最初の句を削除することをお勧めします。application.D.Id == Id

編集: from 句を更新しましたが、テーブル構造がオフのように見えるため、これはまだ機能しないと思います。

于 2013-01-27T16:23:05.117 に答える
0

この問題を解決するために動的クエリは必要ありません。クエリを構築するコードを記述できます。

持っている情報に基づいてフィルターを構築するメソッドを作成します。

public Expression<Func<Application, bool>> GetFilterForCFR(List<int> cfrParts)
{
  if (cfrParts == null || !cfrParts.Any())
  {
    return app => true;
  }
  else
  {
    return app => app.cfr.Any(cfr => cfrParts.Contains(cfr.cfrPId));
  }
}

次に、式を使用してクエリを作成できます。

var query = Apps;
var cfrFilter = GetFilterForCFR(cfrParts);
query = query.Where(cfrFilter);

//TODO apply the other filters

var finalquery = query.Select(app => app.Id);
于 2013-01-27T16:32:25.603 に答える