0

単純なEmployeeクラスについて考えてみます。

Class Employee
{
  public String FirstName {get; set;}
  public int Id {get; set;}
  public int Marks {get; set;}
  public String LastName {get; set;}
}

したがって、LINQクエリで選択するために、次のように記述できます。

var query = Employee.Where(i => i.Id > 2).OrderBy(i => i.Marks);

では、IdとMarksを送信できる2つのパラメーターを受け取る関数を作成できますか。関数呼び出しを行い、必要なパラメーターを渡すことができるようにします。

var query = Employee.Where(i => i.Marks > 2).OrderBy(i => i.FirstName); 

任意のパラメーターを渡すことができるサンプル検索関数

Public String GetQuery(String para1,String para2,......)
{
  var query = Employee.Where(i => i.para1 > 2).OrderBy(i => i.para2); 
  return query;
}
   or

Public String GetQuery(String para1,String para2,......)
{
  String str1=para1...... // with some format included
  String str2=para2...... // with some format included

  var query = Employee.Where(str1).OrderBy(str2); 
  return query;
}

概念は、渡された任意のタイプのパラメーターの値を選択できる共通(汎用)クエリを作成したいということです。

4

2 に答える 2

0

Expression : LambdaExpression を使用する必要があります。

http://msdn.microsoft.com/en-us/library/bb335710.aspx

私のコードでは、似たようなものを使用しました:

private User GetUser(Expression<Func<User, bool>> query)
 {
    User user = context.Users.Where(query).FirstOrDefault();
    if (user == null)
    {
         throw new ProviderException("The supplied user name could not be found.");
    }
    return user;
 }

ユーザー user = GetUser(u => u.Marks == 123);

ユーザー user = GetUser(u => u.FirstName== "abc");

于 2012-06-18T08:36:59.083 に答える
0

タイプ セーフなソリューションでは、文字列の代わりにデリゲートを使用できます。

IEnumerable<Employee> employees = getExampleData();

IEnumerable<Employee> example1 = Query.Employees(employees, Query.UseID, Query.UseMarks);
IEnumerable<Employee> example2 = Query.Employees(employees, Query.UseMarks, Query.UseFirstName);

機能をラップするヘルパー クラス Query を作成しました。

static class Query
{
    public static int UseID(Employee employee, int i) { return employee.Id; }
    public static int UseMarks(Employee employee, int i) { return employee.Marks; }
    public static string UseFirstName(Employee employee, string s) { return employee.FirstName; }
    public static string UseLastName(Employee employee, string s) { return employee.LastName; }

    static public IEnumerable<Employee> Employees(IEnumerable<Employee> employees, func_returnInt where, func_returnInt orderby)
    {
        return employees.Where(i => where(i, 0) > 2).OrderBy(i => orderby(i, 0));
    }
    static public IEnumerable<Employee> Employees(IEnumerable<Employee> employees, func_returnInt where, func_returnString orderby)
    {
        return employees.Where(i => where(i, 0) > 2).OrderBy(i => orderby(i, ""));
    }
}

public delegate int func_returnInt(Employee employee, int i);
public delegate string func_returnString(Employee employee, string s);
于 2012-06-08T17:16:22.467 に答える