1

我想通过使用我的自定义函数检查它们来获取一些元素。

我有人员表:

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

我应该使用我的GetAge() 和其他功能来过滤人员列表。我的以下代码不起作用:

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 子句中使用条件,则需要将它们直接编写为 linq.Expression 以便实体可以解析它并将其转换为 SQL,而不是外部函数。

像这样的作品:

DateTime date = DateTime.Now.AddDays(ageFrom);
all = from item in all
      where item.BirthDay > date
      select item;
于 2013-02-05T10:40:48.960 回答
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 回答
0

或者您可以使用以下语法:

DateTime date = DateTime.Now.AddDays(ageFrom);
all = item.Where(x => x.BirthDay > date).ToList();
于 2013-02-05T10:48:40.353 回答
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 回答