2009-09-04 33 views
1

我真的很困惑于LINQ的行为,我看到它,并导致我一个问题。LINQ 2混淆选择匿名类型时的SQL行为

我写了一个查询,如:

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)查询。 (在by/take之前)如果只需要由我的匿名类型属性指定的列,那么这不会成为问题,但由于它需要所有列和两个表具有不同的列,因此它会失败。

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

回答

1

卡尔,这是因为我是个白痴。

问题是,文本不是表上的属性,它是在那里满足一个接口,并实际返回属于表的另一个属性。

上述更改为:

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

按预期工作。