按计算属性搜索对象列表

时间:2012-11-30 19:39:44

标签: c# linq list linq-to-entities where

这是我的班级:

public class Person
{
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public string FullName { get { return FirstName + " " + LastName; } }
}

这是我的清单:

var persons = new List<Person>();
persons.Add(...);
persons.Add(...);
etc.

如果我尝试通过“计算”属性FullName搜索列表,如下所示:

return persons.Where(p => p.FullName.Contains("blah")) 

我收到以下错误:

  

System.NotSupportedException:指定的类型成员'FullName'是   LINQ to Entities不支持。只有初始化者,实体成员,   支持实体导航属性。

我怎样才能解决这个问题?

3 个答案:

答案 0 :(得分:2)

您不能在IQueriable谓词中使用计算属性。有两种方法可以实现这一目标。

您可以在数据库中创建一个视图,并在那里创建计算的FullName列,并将此列映射回您的数据实体。

其次,您可以将所有数据检索回客户端并在内存中过滤它们:

persons
  .ToList() // Execute this query and get results
  .Where(p => p.FullName.Contains("blah");

答案 1 :(得分:1)

在您的情况下,您只需更改Where即可使用计算属性的两个部分:

return persons.Where(p => (p.FirstName + " " + p.LastName).Contains("blah")) 

答案 2 :(得分:0)

试试我创建的这个nuget包: https://www.nuget.org/packages/NinjaNye.SearchExtensions/

安装完成后,您将能够执行以下操作

people.Search("blah", p => p.FirstName, p => p.LastName);

上述内容会返回FirstNameLastName中存在“blah”的记录。所有这一切都是使用Expression Trees完成的,因此搜索是在SQL 不在内存中

完成的

查看项目页面以获取其他示例用法: https://github.com/ninjanye/SearchExtensions