选择匿名类型时,由LINQ 2 SQL行为混淆

时间:2009-09-04 15:16:11

标签: c# .net linq-to-sql

我真的对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之前的顺序)如果它只需要我的匿名类型属性指定的列就不会有问题,但是因为它需要所有列而两个表有不同的列,所以它会失败。

我可以通过各种不同的方式解决问题,所以我不会因此而停止,我只是想了解上面发生的事情,如果没有办法可以让它只返回你想要的列

1 个答案:

答案 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);

按预期工作。