2009-09-04 31 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); 

按預期工作。