我真的对LINQ的行为感到困惑,我看到它并且它导致了我的问题。
我写了一个像:
这样的查询var reportalerts = pushDB.ReportAlerts
.Select(p => new {p.Title, p.Url, p.DateStamp})
.OrderBy(p => p.DateStamp)
.Take(numResultsPerPage);
这会创建我期望的SQL:
SELECT TOP (5) [t0].[Title], [t0].[Url], [t0].[DateStamp]
FROM [dbo].[ReportAlerts] AS [t0]
ORDER BY [t0].[DateStamp]
如果我然后在我的匿名类型中添加一个额外的属性,则生成的sql完全不同:
var reportalerts = pushDB.ReportAlerts
.Select(p => new {p.Title, p.Url, p.DateStamp, p.Text})
.OrderBy(p => p.DateStamp)
.Take(numResultsPerPage);
变为:
SELECT TOP (5) [t0].[Title], [t0].[Url], [t0].[DateStamp], [t0].[PushReportAlertID], [t0].[DateOfAlert], [t0].[AlertProductID], [t0].[Description], [t0].[Mpid], [t0].[UIName], [t0].[CustomerDesc], [t0].[ProductArea]
FROM [dbo].[ReportAlerts] AS [t0]
ORDER BY [t0].[DateStamp]
现在它需要从表中的每一列。就像它已经决定的那样,这家伙正在为我选择足够的专栏,现在就去抓住所有这些专栏。这对我来说是一个问题,因为我想用另一个具有不同列的表中的类似的查询来连接(即UNION ALL)查询。 (在/ take之前的顺序)如果它只需要我的匿名类型属性指定的列就不会有问题,但是因为它需要所有列而两个表有不同的列,所以它会失败。
我可以通过各种不同的方式解决问题,所以我不会因此而停止,我只是想了解上面发生的事情,如果没有办法可以让它只返回你想要的列
答案 0 :(得分:1)
问题是Text不是表上的属性,它是满足接口并实际返回属于表的另一个属性。
将上述内容更改为:
var reportalerts = pushDB.ReportAlerts
.Where(p => subscribedMpids.Contains(p.Mpid))
.Select(p => new {p.Title, p.Url, p.DateStamp, Text = p.Description})
.OrderBy(p => p.DateStamp)
.Take(numResultsPerPage);
按预期工作。