4

こんにちは、誰かがLINQでwhereifをどのように使用できるかを教えてくれますか

IQueryable<Employee> empQuery;
     if (empId  == "")
     {
         empQuery = dbContext.Emps
           .Include(x => x.Name)
           .Include(x => x.Code)
           .Where(x => x.Id == empId);
     }
     else
     {
        empQuery = dbContext.Emps
           .Include(x => x.Name)
           .Include(x => x.Code);
     }

whereif rightを使用することで、このクエリを非常に簡単にできると思います。誰かがwhereifを使用してこのクエリを簡単にする方法を教えてもらえますか?(empid == "")かどうかを確認する代わりに?

出来ますか?

4

3 に答える 3

6

「whereif」はこの拡張メソッドであると想定しています。ではなく で動作するため、それを使用することはできませIEnumerable<T>IQueryable<T>。その結果、データベースから完全な employees テーブルを要求し、アプリケーションのメモリ内でフィルタリングを実行することになります。それはあなたが望むものではありません。ただし、条件演算子を使用してこれを実現できます。

var empQuery = dbContext.Emps
                        .Include(x => x.Name)
                        .Include(x => x.Code)
                        .Where(x => empId == "" ? true : x.Id == empId);

if(empId != "")これは、サンプル コードで実際に意図したものであると想定していることに注意してください。これを意図していない場合は、2 番目と 3 番目のオペランドを入れ替えてください。

.Where(x => empId == "" ? x.Id == empId : true);

そうは言っても、確かに に対して同じ拡張メソッドを作成できますIQueryable<T>。ほぼ同じに見えますが、にIEnumerable<T>置き換えられIQueryable<T>、述語が式に変更されました。

public static IQueryable<TSource> WhereIf<TSource>(
    this IQueryable<TSource> source,
    bool condition,
    Expression<Func<TSource, bool>> predicate)
{
    if (condition)
        return source.Where(predicate);
    else
        return source;
}
于 2013-02-08T11:58:15.740 に答える
5

空でない場合は、empId でフィルタリングする必要があると思います。単純な OR 演算子が仕事をします:

IQueryable<Employee> empQuery = dbContext.Emps
           .Include(x => x.Name)
           .Include(x => x.Code)
           .Where(x => empId == "" || x.Id == empId);

また、クエリを動的に作成することもできます:

IQueryable<Employee> empQuery = dbContext.Emps
           .Include(x => x.Name)
           .Include(x => x.Code);

if (empId != "")
    empQuery = empQuery.Where(x => x.Id == empId);
于 2013-02-08T11:58:56.363 に答える
0
.Where(x => x.Id == empId);

値が '""' の場合は意味がありません - 何を返すと思いますか?

 var query = (from items in dbContext.Emps
              where items.Id == empId
              select new { 
                          Name = items.Name,
                          Code = items.Code
              }).ToList();
于 2013-02-08T11:59:06.280 に答える