Linq to Entities和连接属性

6

有人知道是否可以在现有实体类型上创建一个新属性,该属性基于两个其他连接在一起的属性吗?

例如,我的Person实体类型具有这些字段“ID”,“名字”,“姓氏”,“出生日期”

我想创建一个名为“全名”的新字段,其中包含以下内容:

Forenames + " " + Surname

所以最终我得到了“ID”、“名字”、“姓氏”、“出生日期”、“全名”。

我知道可以使用Linq进行编程,例如:

var results = from p in db.People
select new { 
ID = p.ID, 
Forename = p.Forename, 
Surname = p.Surname, 
DOB = p.DOB,
Fullname = p.Forename+ " " + p.Surname
};

那么,调用类似以下内容的东西

var resultsAfterConcat = from q in results 
where q.Fullname.Contains(value)
select q;

然而,我真的很想使用Linq to Entities在概念模型层面为我完成这项工作。

4个回答

4
目前还没有,但很快可能会有。首先需要注意的是,您提出的查询建议在LINQ to Entities中根本不起作用,无论是否使用该属性,因为目前它不支持Contains。然而,在.NET 4.0中的新版本Entity Framework中,应该支持在LINQ to Entities查询中使用自定义方法。您可以参考此PDC视频了解更多信息。基本上,您需要将自定义方法写两次:一次在代码中,一次在数据库中(例如,在计算字段中)。有关详细信息,请查看视频。

3

2

之所以“Contains” 对你有效,是因为你调用的是 String.Contains,而不是 Craig 认为的 IEnumerable.Contains。


0

Craig,

开始看这个视频,后来才意识到它有一个多小时长,所以得在我有更多时间的时候再看。只是想让你知道.. Contains 对我来说似乎工作正常,这是由 Linq to Entities 生成的 SQL:

SELECT 
1 AS [C1], 
[Extent1].[PeopleID] AS [PeopleID], 
[Extent1].[Forenames] AS [Forenames], 
[Extent1].[Surname] AS [Surname]
FROM [dbo].[People] AS [Extent1]
WHERE (CHARINDEX(N'Dave', [Extent1].[Forenames] + N' ' + [Extent1].[Surname])) > 0

看起来运行得很好。使用CHARINDEX来判断连接字段是否包含输入的文本,这里是"Dave"。

谢谢 Dave


多么奇怪。我已经验证过它不起作用,这里是MSDN文档,也说明了同样的事情:http://msdn.microsoft.com/en-us/library/bb738638.aspx - Craig Stuntz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接