这是我的班级:
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不支持。只有初始化者,实体成员, 支持实体导航属性。
我怎样才能解决这个问题?
答案 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);
上述内容会返回FirstName
或LastName
中存在“blah”的记录。所有这一切都是使用Expression Trees
完成的,因此搜索是在SQL 不在内存中
查看项目页面以获取其他示例用法: https://github.com/ninjanye/SearchExtensions