2010-08-11 77 views
0

我在MS SQL以下工作TSQL查詢2008SQL LINQ的問題

SELECT 
    Date, 
    COUNT(click) AS clicks, 
    COUNT(sale) AS sales, 
    count(lead) as leads 
FROM 
(
SELECT ClickDate as date ,ID AS click ,CAST(NULL AS int) AS sale , CAST(null as int) as lead 
FROM clicks 

UNION ALL 

SELECT Date,null, ID ,NULL 
FROM sales 

UNION ALL 

SELECT Date,null, NULL ,ID 
FROM leads 

) t 
GROUP BY Date 

我將如何將它轉換爲LINQ to SQL的? 我寫了這個LINQ,但它不起作用。

public class mydata 
{ 
    public DateTime date { get; set; } 
    public int? click { get; set; } 
    public int? sale { get; set; } 
    public int? lead { get; set; } 
} 

var clicks = from c in Clicks 
      select new mydata 
      { 
       date = c.ClickDate, click = c.ID, sale = null, lead = null 
      }; 

var sales = from s in Sales 
      select new mydata 
      { 
       date = s.Date, click = null, sale = s.ID, lead = null 
      }; 

var leads = from l in Leads 
      select new mydata 
      { 
       date = l.Date, click = null, sale = null, lead = l.ID 
      }; 

var v = clicks.Concat(sales).Concat(leads); 

var res = from x in v 
     group x by x.date into xg 
     select new 
     { 
       date = xg.Key, clicks = xg.Count(z => z.click != null) 
     }; 
} 

如何更正此LINQ查詢?

更新: i根據David B的建議修改了LINQ查詢。

我仍然收到以下錯誤: 「使用UNION,INTERSECT或EXCEPT運算符組合的所有查詢在其目標列表中必須具有相同數量的表達式。」

+0

您的查詢出了什麼問題? – Nix 2010-08-11 13:12:43

+0

1.分組錯誤「使用UNION,INTERSECT或EXCEPT運算符組合的所有查詢在其目標列表中必須具有相同數量的表達式。」 2.錯誤說不允許空值 3.錯誤談論kg.Count(),「不能將int轉換爲布爾」。 – RuSh 2010-08-11 13:18:22

回答

0

問題是,投影中的匿名類型不一致... ID是int,另一個是Nullable<int>

而不是使用您的投影匿名類型,使用此:

public class ConcatTarget 
{ 
    public DateTime TheDate {get;set;} 
    public int? ID {get;set;} 
    public string sale {get;set;} 
    public string lead {get;set;} 
} 

即使沒有實例實際構成,LinqToSql使用類的形狀翻譯查詢。

至於Count,也許你的意思是.Count(x => x.Prop != null)


好吧,顯然你已經在一個有錯誤的翻譯行爲描述here命中。

發生了什麼事是SQL翻譯看到空分配,並把它們扔掉。這會導致在這些集合之間選擇不正確的sql列數。

這裏是一個可能的解決方法:

int? myNull = null; 

var clicks = 
    from c in Clicks 
    select new mydata 
    { 
    date = c.ClickDate, 
    click = c.ID, 
    sale = c.ID + myNull, 
    lead = myNull + c.ID //note - expressions must be unique 
    }; 

的基本思路是,以創造獨特的表現形式的查詢翻譯不能扔掉。這比聽起來更難(上面是我的第九次嘗試)。


這裏的其他兩個表:

var sales = from s in Sales 
     select new mydata 
     { 
      date = s.Date, 
      click = s.ID + myNull, 
      sale = s.ID, 
      lead = myNull + s.ID 
     }; 

var leads = from l in Leads 
     select new mydata 
     { 
      date = l.Date, 
      click = l.ID + myNull, 
      sale = myNull + l.ID, 
      lead = l.ID 
     }; 

如果你有超過2列,要被清零,你可以求助於減法,除法,乘法等

+0

thx的幫助,我試圖做到這一點,你可以看到我上面的更新代碼,即時通訊仍然出現錯誤。 – RuSh 2010-08-11 15:17:25

+0

是的,我看到查詢翻譯錯誤。 我試過你的解決方案,但我不知道如何將其應用於其餘表格(銷售,線索..)。哇,這比我想象的更難。 – RuSh 2010-08-12 12:48:19

0

大衛對前兩個問題是正確的。對於最後一個問題(3),Count()在SQL中不起作用。它期望一個返回bool的謂詞。您使用整數(即z.click,z.sales等)