2009-07-21 21 views
2

Ich habe die folgende SQL zu tun, wie ich dies in LINQ implementiere (C# bitte :))Wie die folgend in LINQ

SELECT  a.Category, a.Description, a.Item, a.[Value], a.Loading, a.MaxDiscount, MIN(b.EffectiveDate) AS FromDate, a.EffectiveDate AS EndDate, a.SortOrder, a.ID 
FROM List a 
LEFT OUTER JOIN List b ON a.[Value] = b.[Value] AND a.Category = b.Category AND a.Description = b.Description AND a.Item = b.Item AND a.EffectiveDate < b.EffectiveDate 
GROUP BY a.Category, a.Description, a.Item, a.[Value], a.Loading, a.MaxDiscount, a.SortOrder, a.EffectiveDate, a.ID 
HAVING  (a.Category = 'General') AND (a.Description = 'Cover') AND (a.EffectiveDate <= CONVERT(DATETIME, '2009-04-01 00:00:00', 102)) AND (MIN(b.EffectiveDate) >= CONVERT(DATETIME, '2009-04-01 00:00:00', 102) OR MIN(b.EffectiveDate) IS NULL) AND (a.Item = 'Type') 
ORDER BY a.SortOrder 

Ich habe folgende (mit SubSonic Linq)

var query = from a in List.All() join b in List.All() 
      on new {a.Value,a.Category ,a.Description,a.Item} 
      equals new {b.Value,b.Category ,b.Description,b.Item} into temp 

ich habe keine Ahnung, wie die a.EffectiveDate < b.EffectiveDate im Moment hinzuzufügen

+6

Zumindest zeigen Sie uns, was Sie bisher haben, sonst enden wir einfach die ganze Arbeit für Sie und nichts wird gelernt. – leppie

+1

Ich habe folgende (mit SubSonic Linq) var query = aus einem in List.All() Join b in List.All() auf new {a.Value, a.Category, a.Description, a. Artikel} gleich neue {B.Wert, b.Category, b.Description, b.Item} in Temp ich habe keine Ahnung, wie die a.EffectiveDate hinzufügen Podge

Antwort

0

Wenn Sie nicht beitreten, müssen Sie nicht neu formieren müssen. Wenn Sie nicht beitreten, müssen Sie keine lustige on-Klausel haben.

Alles, was Sie tun wollen, ist Filter, alles was Sie tun sollten ist "wo".

someDate = new DateTime(2009, 4, 1); 

var query = 
from a in List 
where a.Category == "General" 
where a.Description == "Cover" 
where a.Item == "Type" 
where a.EffectiveDate < someDate 
let minDate = 
(
    from b in List 
    where a.Value == b.Value 
    where a.Category == b.Category 
    where a.Description == b.Description 
    where a.Item == b.Item 
    where a.EffectiveDate < b.EffectiveDate 
    orderby b.EffectiveDate 
    select new DateTime? (b.EffectiveDate) 
).FirstOrDefault() 
where !minDate.HasValue || someDate < minDate.Value 
orderby a.SortOrder 
select a; 
+0

nicht sicher, ob ein auf Klausel ist "lustig". –

+0

http://dilbertblog.typepad.com/the_dilbert_blog/2007/07/subjektive-humo.html –

-1

ich würde Ihnen vorschlagen, SP (Stored Procedure) für Ihre Abfrage zu erstellen und beinhalten, dass SP in DBML Datei, die mit Ihnen können Zugriff/Aufruf als Methode von DataContext Objekt.

Schließlich Code für den Menschen ist, zu verstehen, zu halten ist so einfach wie möglich :)

Klicken Sie hier, um mehr über "How to call Stored procedure in LINQ"

Verwandte Themen