5

这是我的课:

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:LINQ to Entities 不支持指定的类型成员“FullName”。仅支持初始化程序、实体成员和实体导航属性。

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

4

3 回答 3

2

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

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

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

persons
  .ToList() // Execute this query and get results
  .Where(p => p.FullName.Contains("blah");
于 2012-11-30T20:02:58.753 回答
1

在您的情况下,您可以简单地更改您Where以使用计算属性的两个部分:

return persons.Where(p => (p.FirstName + " " + p.LastName).Contains("blah")) 
于 2012-11-30T20:01:19.467 回答
0

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

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

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

上面返回的记录中“blah”存在于FirstNameORLastName中。所有这些都是使用Expression Trees所以搜索是在 SQL中而不是在内存中完成的

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

于 2014-01-21T17:18:33.223 回答