C# 按计算属性搜索对象列表

C# 按计算属性搜索对象列表,c#,linq,list,linq-to-entities,where,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(...);

这是我的班级:

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.
我得到以下错误:

System.NotSupportedException:指定的类型成员“FullName”为 LINQ to实体中不支持。仅限初始值设定人、实体成员、, 并支持实体导航属性


我如何解决这个问题?

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

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

不能在
IQueriable
谓词中使用计算属性。实现这一点有两种方法

您可以在数据库中创建一个视图,并在其中创建计算的FullName列,然后将该列映射回您的数据实体

其次,您可以将所有数据检索回客户端,并在内存中进行筛选:

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

尝试我创建的nuget软件包:

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

people.Search("blah", p => p.FirstName, p => p.LastName);
上面返回了
FirstName
LastName
中存在“blah”的记录。所有这些都是使用表达式树来完成的,因此搜索是在SQL中完成的,而不是在内存中完成的

签出项目页面以了解其他示例用法:

如果这是一个EF映射,那么您应该将全名作为一个函数而不是属性来编写,这样EF就知道它不能使用它。我认为这不可能让LINQ 2实体找出并将这个谓词转换为适当的SQL。请尝试改用非计算属性。如果在此实例中搜索全名,则可能会重复此属性。很遗憾,这将不起作用。例如,即使FirstName和LastName属性分别为“Bob”和“Jones”,搜索“Bob Jones”也不会得到您要查找的内容。@user1733939您可以执行
p=>(p.FirstName+“”+p.LastName)。包含(“blah”)
?(我不确定这是否有效,因为EF非常挑剔)就是这样。很好,乔恩B!是的,您可以同时执行这两项操作,但是1)必须求助于创建视图并不理想,尤其是在使用EF的情况下;2)返回整个表,然后过滤效率极低。我希望这里有一个银弹…不幸的是,即使在理论上也没有任何方法可以实现这一点:LINQ提供程序使用表达式树将谓词转换为适当的SQL查询,但没有方法将属性getter body转换为SQL语句。是的,这是一个不幸的实现。可怜。谢谢你,谢尔盖。
people.Search("blah", p => p.FirstName, p => p.LastName);