2010-08-11 78 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等)