2010-08-11 3 views
0

J'ai la requête suivante dans TSQL travail MS SQL 2008SQL LINQ Question

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 

Comment puis-je convertir en LINQ to SQL? J'ai écrit ce LINQ mais cela ne fonctionne pas.

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

Comment corriger cette requête LINQ?

Mise à jour: i Modification de la requête LINQ basée sur la recommandation David B.

Je reçois toujours l'erreur suivante: "Toutes les requêtes combinées à l'aide d'un opérateur UNION, INTERSECT ou EXCEPT doivent avoir un nombre égal d'expressions dans leurs listes cibles."

+0

Qu'est-ce qui ne va pas avec votre requête? – Nix

+0

1. erreur de regroupement "Toutes les requêtes combinées à l'aide d'un opérateur UNION, INTERSECT ou EXCEPT doivent avoir un nombre égal d'expressions dans leurs listes cibles." 2. erreur concernant les valeurs nulles non autorisées 3. erreur concernant kg.Count(), "impossible de convertir int en bool". – RuSh

Répondre

0

Le problème est que les types anonymes dans les projections ne sont pas identiques ... ID est int dans un et Nullable<int> dans un autre.

Au lieu d'utiliser un type anonyme dans vos projections, utilisez ceci:

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

Même si aucun cas sont effectivement construits, LinqToSql utilise la forme de la classe pour traduire la requête.

Comme pour Count, peut-être que vous vouliez dire .Count(x => x.Prop != null)?


Ok, apparemment, vous avez frappé sur un comportement de traduction buggy comme décrit here.

Qu'est-ce qui se passe, le traducteur SQL voit les affectations nulles, et les rejette. Cela provoque un nombre incorrect de colonnes sql à sélectionner entre les ensembles.

Voici une solution possible:

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

L'idée de base est de créer des expressions uniques le traducteur de requête ne peut pas jeter. C'est plus difficile que ça en a l'air (ci-dessus est ma neuvième tentative).


est ici les deux autres tableaux:

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

Si vous aviez plus de 2 colonnes à être-Nulled, vous pourriez avoir recours à la soustraction, division, multiplication, etc.

+0

thx pour l'aide, j'ai essayé de le faire, vous pouvez voir mon code mis à jour ci-dessus, je reçois toujours une erreur. – RuSh

+0

Oui, j'ai vu que la requête est traduite dans le mauvais sens. J'ai essayé votre solution mais je ne suis pas sûre de comprendre comment l'appliquer au reste des tables (ventes, leads ...). Wow c'est plus dur que je ne le pensais. – RuSh

0

David a raison à propos des deux premiers problèmes. Pour votre dernier problème (3), Count() ne fonctionne pas comme dans SQL. Il attend un prédicat qui renvoie un booléen. Vous l'utilisez avec ints (c'est-à-dire z.click, z.sales, etc.)