11

LINQで動的where条件を使用する必要があるシナリオがあります。

私はこのようなものが欲しい:

public void test(bool flag)
{
   from e in employee
   where e.Field<string>("EmployeeName") == "Jhom"
   If (flag == true)
   {
       e.Field<string>("EmployeeDepartment") == "IT"
   }
   select e.Field<string>("EmployeeID")
}

Linqクエリの途中で「If」を使用できないことは知っていますが、これに対する解決策は何ですか?

助けてください...

4

5 に答える 5

11

ブログ投稿全体をチェックしてください:Linqを使用した動的クエリ

使用できるオプションは2つあります。

動的LINQライブラリ

string condition = string.Empty;
if (!string.IsNullOrEmpty(txtName.Text))
    condition = string.Format("Name.StartsWith(\"{0}\")", txtName.Text);

EmployeeDataContext edb = new EmployeeDataContext();
if(condition != string.empty)
{
  var emp = edb.Employees.Where(condition);
 ///do the task you wnat
}
else
{
 //do the task you want 
}

述語ビルダー

述語ビルダーは動的LINQライブラリと同様に機能しますが、タイプセーフです。

var predicate = PredicateBuilder.True<Employee>();

if(!string.IsNullOrEmpty(txtAddress.Text))
    predicate = predicate.And(e1 => e1.Address.Contains(txtAddress.Text));

EmployeeDataContext edb= new EmployeeDataContext();
var emp = edb.Employees.Where(predicate);

上記のライブラリの違い:

  • PredicateBuilderを使用すると、タイプセーフな動的クエリを作成できます。
  • 動的LINQライブラリを使用すると、文字列を使用して指定された動的なWhere句とOrderBy句を使用してクエリを作成できます。
于 2011-04-15T09:14:22.683 に答える
9

したがって、すべてのJhomが必要な場合、およびflagtrueの場合、IT部門のJhomのみが必要です。falseflag

この状態

!flag || (e.Field<string>("EmployeeDepartment") == "IT"

その基準を満たしているため(フラグがfalseの場合は常にtrueなど)、クエリは次のようになります。

from e in employee    
where e.Field<string>("EmployeeName") == "Jhom"
  && (!flag || (e.Field<string>("EmployeeDepartment") == "IT")
select e.Field<string>("EmployeeID") 

また、このe.Field<string>("EmployeeID")ビジネスは、ソフトコーディングのようなにおいがするので、それを調べるかもしれません。私は推測する

from e in employee    
where e.EmployeeName == "Jhom"
  && (!flag || (e.EmployeeDepartment == "IT")
select e.EmployeeID

よりコンパクトになり、入力ミスが起こりにくくなります。


編集:この答えは、この特定のシナリオで機能します。この種のクエリがたくさんある場合は、必ず他の回答で提案されているパターンに投資してください。

于 2011-04-15T09:16:23.510 に答える
2

メソッドを連鎖させることができます:

public void test(bool flag)
{
   var res = employee.Where( x => x.EmployeeName = "Jhom" );

   if (flag)
   {
       res = res.Where( x => x.EmployeeDepartment == "IT")
   }

   var id = res.Select(x => x.EmployeeID );
}
于 2011-04-15T09:15:35.603 に答える
0
from e in employee    
where e.Field<string>("EmployeeName") == "Jhom" &&
(!flag || e.Field<string>("EmployeeDepartment") == "IT")
select e.Field<string>("EmployeeID") 
于 2011-04-15T09:16:41.170 に答える
0

LINQメソッドを明示的に呼び出し、条件付きでチェーンすることができます。

public IEnumerable<string> FilterEmployees (IEnumerable<Employee> source, bool restrictDepartment)
{
    var query = source.Where (e => e.Field<string>("EmployeeName") == "Jhom");

    if (restrictDepartment) // btw, there's no need for "== true"
        query = query.Where (e => e.Field<string>("EmployeeDepartment") == "IT");

    return query.Select (e => e.Field<string>("EmployeeID"));
}
于 2011-04-15T09:34:07.833 に答える