【问题标题】:Linq to Entities and concatenated propertiesLinq to Entities 和级联属性
【发布时间】:2008-11-18 16:35:42
【问题描述】:

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

例如我的个人实体类型有这些字段“ID”、“Forename”、“Surname”、“DOB”

我想创建一个名为“全名”的新字段

Forenames + " " + Surname

所以我最终得到“ID”、“Forename”、“Surname”、“DOB”、“Fullname”。

我知道我可以使用 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 为我完成这项工作。

【问题讨论】:

    标签: c# linq c#-3.0 linq-to-entities


    【解决方案1】:

    还没有,但可能很快。首先,请注意,无论有没有该属性,您建议的查询在 LINQ to Entities 中都不起作用,因为目前它不支持包含。但是,.NET 4.0 中的新版本实体框架应该支持 LINQ to Entities 查询中的自定义方法。你可以看到a video about this from PDC。本质上,您必须编写两次自定义方法;一次在代码中,一次在您的数据库中(例如,在计算字段中)。有关详细信息,请参阅视频。

    【讨论】:

      【解决方案2】:

      对于任何在问题得到解答多年后偶然阅读本文的人:

      这里有一个更新且更符合 DRY 的答案:Using a partial class property inside LINQ statement

      【讨论】:

        【解决方案3】:

        Contains 对您“有效”的原因是因为您调用的是 String.Contains,而不是 Craig 认为的 IEnumerable.Contains。

        【讨论】:

          【解决方案4】:

          克雷格,

          刚看完视频,发现有一个多小时,等我有时间再看。只是想让你知道.. 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 来锻炼如果 Concatinated 字段包含输入的文本,即上述情况是“Dave”。

          谢谢 戴夫

          【讨论】:

          猜你喜欢
          • 2020-06-18
          • 2022-11-17
          • 1970-01-01
          • 2012-03-08
          • 1970-01-01
          • 1970-01-01
          • 2011-06-14
          • 2010-11-26
          • 1970-01-01
          相关资源
          最近更新 更多