【问题标题】:EF-generated SQL and properties mapping/projectionEF 生成的 SQL 和属性映射/投影
【发布时间】:2014-06-26 16:55:43
【问题描述】:

我正在尝试重用 EntityFramework 6 生成的 SQL 作为手动创建的 SQL 语句中的子选择。例如,以下查询:

dbContext.Users
     .GroupBy(u => u.Email)
     .Select(g => new {Email = u.Key, Name = g.Max(u1 => u1.Name)})
     .ToString()

导致以下 SQL:

SELECT 
1 AS [C1], 
[GroupBy1].[K1] AS [Email], 
[GroupBy1].[A1] AS [C2]
FROM ( SELECT 
    [Extent1].[Email] AS [K1], 
    MAX([Extent1].[Name]) AS [A1]
    FROM [dbo].[Users] AS [Extent1]
    GROUP BY [Extent1].[Email]
)  AS [GroupBy1]

请注意,select 中的字段列表与查询返回的数据类型不匹配(有一个 C1、C2 不在 {Email, Name} 的匿名类型中)。有没有办法通过查看查询属性/等来找出映射?然后我就可以在外部 SQL 语句中引用这些属性了。

【问题讨论】:

  • 这样做听起来有点冒险,因为 SQL 查询是动态生成的,并且不能保证它总是一样的。

标签: c# .net sql-server linq entity-framework


【解决方案1】:

您最好手动编码。这是一个完整的例子:

CREATE TABLE #Users (Email varchar(200), Name varchar(200))

INSERT INTO #Users (Email, Name) VALUES ('vold@stack.com', 'Vololdymyr 1')
INSERT INTO #Users (Email, Name) VALUES ('vold@stack.com', 'Vololdymyr 2')

SELECT u.Email, MAX(u.Name) As Name FROM #Users u GROUP BY Email

DROP TABLE #Users

结果是:

Email               Name
---------------------------------
vold@stack.com      Vololdymyr 2

【讨论】:

  • 谢谢,尽管我已经编写了手动 SQL,并且正在寻找在编写查询时利用 linq/VS intellisense 和编译时检查的方法。
  • 啊,好的。我明白你现在在做什么。感谢您的解释!
猜你喜欢
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
相关资源
最近更新 更多