1

カスタム関数でそれらをチェックして、いくつかの要素を取得したいと思います。

私は Person テーブルを持っています:

public class Person
{
        public int Id { get; set; }
        public DateTime BirthDay { get; set; }
        public string Name { get; set; }
        ...
}

個人リストをフィルタリングするには、myGetAge() 関数と他の関数を使用する必要があります。私の次のコードは機能しません:

public List<Person> FilterPersons(int ageFrom, int ageTo...etc..) 
{
    var all = Database.Persons.AsQueryable(); 

    all = from item in all
          where GetAge(item.BirthDay) > ageFrom
          select item;

    all = from item in all
          where GetAge(item.BirthDay) < ageTo
          select item;

    // other operations
    ...
}

そう書けると思います。これを行うためのすべてのステップで:

List<Person> newList = new List<Person>();
foreach (var item in all)
{
   var itemAge = Common.GetAge(item.BirthDay);
   if (itemAge > AgeFrom)
   {
       newList.Add(item);
   }
}
all = newList.List();

しかし、これは私が考える最良の方法ではありません。なぜなら、多くの基準でフィルタリングする必要があるからです。低速で動作します。

Linq クエリで関数を使用するにはどうすればよいですか?

編集: たとえば、GetAge() 関数を示しました。私はそのような多くの機能を持っています。自分の機能の使い方を知りたかったのです。

4

5 に答える 5

3

まあ、できません。

SQLクエリのWhere句で基準を使用する場合は、エンティティがそれを解析して外部関数ではなくSQLに変換できるように、それらをlinq.Expressionとして直接記述する必要があります。

このようなものは機能します:

DateTime date = DateTime.Now.AddDays(ageFrom);
all = from item in all
      where item.BirthDay > date
      select item;
于 2013-02-05T10:40:48.960 に答える
0

List<Person>.FindAll()メソッドを使用して、述語としてメソッドフィルターを渡してみませんか?このような方法を使用します。

List<Person> filteredPersons = allPersons.FindAll(FilterPersons);

以下は、フィルターとして使用するサンプルメソッドです。

bool FilterPersons(Person p)
{
    if(//enter criteria here to determine if you want to select the person)
        return true;
    else
        return false;
}

あなたが望むことをするために、これはあなたが必要とするコードかもしれません。

bool FilterPersons(Person p)
{
    var itemAge = Common.GetAge(item.BirthDay);

    if( itemAge > AgeFrom )
        return true;
    else
        return false;
}
于 2013-02-05T10:59:14.140 に答える
0

結果にフィルターを適用できると仮定します。

通常のフィルターを (linq式で) 適用し、結果に関数を適用することができます。もちろん、refactorあなたの方法が必要です。

このようなもの :

var result= Users.Where(s=>s.Name).ToList();
result= MyFilter(result);
于 2013-02-05T11:01:46.833 に答える
0

または、次の構文を使用できます。

DateTime date = DateTime.Now.AddDays(ageFrom);
all = item.Where(x => x.BirthDay > date).ToList();
于 2013-02-05T10:48:40.353 に答える
0

クエリ式は C# コンパイラに組み込まれているため、コンパイラに組み込まれている式のみを認識します。

たとえば、whereキーワードを使用すると、それがWhere<TSource>(this IQueryable<TSource> source, Func<TSource, bool> predicate)メソッドの呼び出しに変換されます。

これは、Linq To Objects と Linq To SQL に当てはまります。さらに、Linq To SQL を使用すると、コンパイラはクエリ式を SQL に変換する必要があり、メソッドの定義を知る方法がありませんGetAge

于 2013-02-05T10:48:10.087 に答える