2016-05-30 8 views
0

Ich lese eine einfache CSV-Datei aus meinem Programm. Hier ist, was meine CSV-Datei wie folgt aussieht:LINQ-TO-SQL-Abfrage funktioniert nicht mit CSV-Datei

NASDQ,O, 
OTC,O, 
NYSE,N, 
TSE,T, 

Hier mein Code ist die CSV-Datei zu lesen:

string csvFile = @"x:\tech\SQL_IntlPricing\ExchangeLookup.csv"; 
string[] csvLines = File.ReadAllLines(csvFile); 

var csvValues = csvLines 
    .Select(l => new { 
     Exchange = l.Split(',').First(), 
     Lookup = l.Split(',').Skip(1).First()}); 

Bisher ist alles mit dem Code in Ordnung. Ich verwende die folgende LINQ-Abfrage:

from comp in Companies 
where !comp.Coverage_status.Contains("drop") 
select new 
{ 
    FSTick = string.Format("{0}-{1}", comp.Ticker, 
       csvValues 
        .Where(v => v.Exchange.Contains(comp.Exchange)) 
        .Select(v => v.Lookup).FirstOrDefault()) 
}; 

Aber ich bin immer folgende Fehlermeldung:

NotSupportedException: Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator. 

Grundsätzlich versuche ich, die folgenden Ergebnisse zu erhalten:

AAPL-O 
MSFT-O 

Gibt es eine Möglichkeit für mich, mit meiner LINQ-Abfrage die gewünschten Ergebnisse zu erzielen?

+0

Können Sie nach, was 'Companies' ist/seine Aufgabe? Es sieht so aus, als würde linq-to-sql die Auflistung (Sequenz) nicht unterstützen, die von der linq-Anweisung selbst erstellt wird (comp hier). Ich würde den gesamten Ausdruck in Linq-Erweiterungsmethoden umwandeln. – Veverke

+0

Ich bin mir nicht sicher, ob ich folge. Unternehmen ist eine SQL-Tabelle in meiner Datenbank. Was genau verlangst du? –

+0

@Veverke würden Sie bitte ein Beispiel geben? –

Antwort

2

Wenn Unternehmen sind nicht viel, dann die einfache Lösung wäre:

from comp in Companies.Where(c => !c.Coverage_status.Contains("drop")).AsEnumerable() 
select new 
{ 
    FSTick = string.Format("{0}-{1}", comp.Ticker, 
       csvValues 
        .Where(v => v.Exchange.Contains(comp.Exchange)) 
        .Select(v => v.Lookup).FirstOrDefault()) 
}; 

Sonst könnte man die Filterung tun es gerne;

from comp in Companies.Where(c => 
     csvValues.Select(cs => cs.Exchange).Contains(comp.Exchange) && 
     !c.Coverage_status.Contains("drop") 
    ).AsEnumerable() 
    select new 
    { 
     FSTick = string.Format("{0}-{1}", comp.Ticker, 
        csvValues 
         .Where(v => v.Exchange.Contains(comp.Exchange)) 
         .Select(v => v.Lookup).FirstOrDefault()) 
    }; 
+0

Die Companies-Tabelle hat etwa 2000 Unternehmen.Lassen Sie mich mit der zweiten Option beginnen.Ich erhalte einen Fehler: 'Der Name 'comp' existiert nicht im aktuellen Kontext.' Die erste Option gab mir keine Fehler, aber ich bekomme nicht die Ergebnisse, die ich möchte.Ich bekomme die US-Unternehmen richtig, aber nicht international, wie TSE. Hier ist, was ich für meine Ergebnisse bekomme: 'AAPL-O, ALA-'. Hinweis: ALA ist im TSE-Austausch aufgeführt. Also sollte ich "ALA-T" bekommen. –

+0

Ich habe versucht, Ihr Update und ich bekomme immer noch nicht die Ergebnisse, die ich will. Außerdem dachte ich, dass das Problem nur die Nationalspieler betrifft, aber ich bekomme auch keinen OTC-Austausch. Hier ist, was ich jetzt bekomme: 'AAPL-O, ALA-, AMZN-'. Ich sollte bekommen: 'AAPL-O, ALA-T, AMZN-O'. –

+0

Ich habe nur Ihren Code korrigiert. Ich habe deine Daten nicht. Wenn Sie Ihre Daten als Code bereitstellen, könnten wir uns ansehen, was es ist. –

0

Nach meinem Kommentar oben, wenn Umwandlung der Linq-SQL-Ausdruck in seine Erweiterungsmethoden Syntax Form in Ordnung ist, können Sie folgendes tun können:

ich eine Liste von Unternehmen erstellt, nur um der Beispiel. Unternehmen definiert wurden als

public class Company 
    { 
     public string Coverage_status { get; set; } 
     public string Exchange { get; set; } 
     public string Ticker { get; set; } 
    } 

Hier ist ein Beispiel anzeigen, wie der Code würde wie folgt aussehen:

List<string> csvLines = new List<string> 
    { 
     "NASDQ,O,", 
     "OTC,O,", 
     "NYSE,N,", 
     "TSE,T," 
    }; 

    var csvValues = csvLines 
    .Select(l => new 
    { 
     Exchange = l.Split(',').First(), 
     Lookup = l.Split(',').Skip(1).First() 
    }); 

    List<Company> companies = new List<Company> 
    { 
     new Company { Coverage_status = "aaa", Ticker = "123", Exchange = "NASDQ"}, 
     new Company { Coverage_status = "1521drop422", Ticker = "1251223", Exchange = "aaaaaaaa"}, 
     new Company { Coverage_status = "f2hdjjd", Ticker = "15525221123", Exchange = "TSE"} 
    }; 

    var result = companies 
     .Where(c => !c.Coverage_status.Contains("drop")) 
     .Select(n => new 
     { 
      FSTick = string.Format("{0}-{1}", n.Ticker, 
       csvValues 
        .Where(v => v.Exchange.Contains(n.Exchange)) 
        .Select(v => v.Lookup).FirstOrDefault()) 
     }); 

    foreach (var r in result) 
     Console.WriteLine(r.FSTick); 

Für die Aufzeichnung dieses Code ist definitiv nicht Performance-weise.


Ausgang:

enter image description here

+0

Seltsam! Ich habe Ihren Vorschlag mit 1 Zusatz versucht: 'var companyList = Companies.Select (c => neue Firma {Ticker = c.Ticker.Trim(), Exchange = c.Primary_exchange.Trim(), Coverage_status = c.Coverage_status}); '. Ich erhalte jetzt meinen ursprünglichen Fehler. –

Verwandte Themen