2012-01-11 21 views
-1

私は自分のシステムの管理者用の検索ページを実装しようとしています。短いストーリー、そこに3つのパラメタが基準としてあります。 1.ユーザー、2.projects、3.顧客。管理者は、これらの3つの基準を任意に組み合わせることができます。 「このプロジェクトに割り当てられたすべてのユーザーとすべての顧客を表示したい」または「この顧客とこのプロジェクトを表示したいが、すべてのユーザーを表示したい」など)。どのようにそのようなフィルタリングを実装していますか?私はasp.net 4.0とlinqを使用しています。管理者のフィルタリング検索を実装する方法

ここに機能の内容はすべてです。私は条件によってそれを作ったが、それは全く健康ではない。

public static List<Data.CurrentActivity> GetUsersActivitySearch(string employeeId, string projectId, string customerId, DateTime startDate, DateTime endDate) 
     { 
      DataClassesDataContext dc = new DataClassesDataContext(General.ConnectionString); 

      if(projectId=="" && customerId!="") 
       return dc.CurrentActivities.Where(t => t.User.RecId.ToString() == employeeId && t.Customer.RecId.ToString() == customerId && t.ActivityDate >= startDate && t.ActivityDate <= endDate).ToList(); 
      else if (projectId != "" && customerId == "") 
       return dc.CurrentActivities.Where(t => t.User.RecId.ToString() == employeeId && t.Project.RecId.ToString() == projectId && t.ActivityDate >= startDate && t.ActivityDate <= endDate).ToList(); 
      else if (projectId != "" && customerId != "") 
       return dc.CurrentActivities.Where(t=>t.User.RecId.ToString()==employeeId && t.Customer.RecId.ToString()==customerId && t.Project.RecId.ToString()==projectId && t.ActivityDate>=startDate && t.ActivityDate<=endDate).ToList(); 
      return dc.CurrentActivities.Where(t => t.User.RecId.ToString() == employeeId && t.ActivityDate >= startDate && t.ActivityDate <= endDate).ToList(); 
     } 
+0

あなたは少なくともそれを試して、あなたが立ち往生するいくつかのコードを投稿する必要があります。他の人たちが完全な解決策を考え出すことを期待しないでください。 – Glenn

答えて

0

これでコードが表示されたので、簡単な解決策があります。あなたの結果を表示するための十分な情報を表すことができ、一般化オブジェクトを持っていた場合

 DataClassesDataContext dc = new DataClassesDataContext(General.ConnectionString); 
     var result = dc.CurrentActivies.Where(t.ActivityDate >= startDate && t.ActivityDate <= endDate); 

     if(userId.Length > 0) 
      result = result.Where(t => t.User.RecId.ToString() == employeeId); 

     if (projectId.Length > 0) 
      result = result.Where(t => t.Project.RecId.ToString() == projectId); 

     if (customerId.Length > 0) 
      result = result.Where(t=>t.Customer.RecId.ToString()==customerId); 

     return result.ToList(); 

:あなたが実際にあるため怠惰な実行のたIQueryableインターフェイス上where句を配合することができます。それで、あなたは次のようなことをすることができます:

public IList<SearchResults> Search(string user, string customer, string project) 
{ 
    return (from user in context.Users 
     where SqlMethods.Like(user.Name, user) && user.Length > 0 
     select new SearchResult 
     { 
      ... properties you care about 
     }) 
     .Concat(from project in context.Projects 
      where SqlMethods.Like(project, project.Name) && project.Length > 0 
      select new SearchResult 
      { 
       /// 
      }) 
     .Concat(from customer in context.Customers 
      where SqlMethods.Like(customer, customer.Name) && customer.Length > 0 
      select new SearchResult 
      { 
       /// 
      }) 
     .ToList(); 
} 
+0

このエラーが発生しました。式 'テーブル(顧客).Where(顧客=> Like(customer.RecId.ToString()、Invoke(value(System.Func'1 [System.String]))))を翻訳できませんでした。 (顧客=>呼び出し(値(System.Func'1 [Data.CurrentActivity]))) 'をSQLに選択し、ローカル式として扱うことができませんでした。 – Ktt

+0

しかし、私はuser.nameのテーブルの主キーで検索しようとしていた。私は代わりにuser.recIdをしました – Ktt

+0

名前を使用してもうまくいきませんでした。 – Ktt

関連する問題