C# LINQ-TO-SQL查询不使用CSV文件

C# LINQ-TO-SQL查询不使用CSV文件,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我正在从我的程序中读取一个简单的csv文件。以下是我的csv文件的外观: NASDQ,O, OTC,O, NYSE,N, TSE,T, 以下是我读取csv文件的代码: string csvFile = @"x:\tech\SQL_IntlPricing\ExchangeLookup.csv"; string[] csvLines = File.ReadAllLines(csvFile); var csvValues = csvLines .Select(l => new {

我正在从我的程序中读取一个简单的csv文件。以下是我的csv文件的外观:

NASDQ,O,
OTC,O,
NYSE,N,
TSE,T,
以下是我读取csv文件的代码:

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 ()});
到目前为止,代码一切正常。我正在使用以下LINQ查询:

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())
};
但我得到了以下错误:

NotSupportedException: Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator.
基本上,我试图得到以下结果:

AAPL-O
MSFT-O

有没有一种方法可以让我使用LINQ查询获得想要的结果?

如果公司不多,那么简单的解决方案是:

    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())
};
否则,你可以像这样在那里进行过滤

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

如果公司数量不多,那么简单的解决方案是:

    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())
};
否则,你可以像这样在那里进行过滤

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

根据我上面的评论,如果可以将linq sql表达式转换为其扩展方法语法形式,则可以执行以下操作:

为了这个例子,我创建了一个公司列表。公司被定义为

   public class Company
    {
        public string Coverage_status { get; set; }
        public string Exchange { get; set; }
        public string Ticker { get; set; }
    }
下面是代码的完整示例:

 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);
List csvLines=新列表
{
“NASDQ,O,”,
“OTC,O,”,
“纽约证券交易所,N,”,
“谢,T,”
};
var csvValues=csvLines
.选择(l=>new
{
Exchange=l.Split(',').First(),
Lookup=l.Split(',).Skip(1).First()
});
上市公司=新名单
{
新公司{Coverage_status=“aaa”,Ticker=“123”,Exchange=“NASDQ”},
新公司{Coverage_status=“1521drop422”,Ticker=“1251223”,Exchange=“aaaaaa”},
新公司{Coverage_status=“f2hdjjd”,Ticker=“15525221123”,Exchange=“TSE”}
};
var结果=公司
其中(c=>!c.Coverage_status.Contains(“drop”))
.选择(n=>new
{
FSTick=string.Format(“{0}-{1}”),n.Ticker,
CSV值
其中(v=>v.Exchange.Contains(n.Exchange))
.Select(v=>v.Lookup).FirstOrDefault()
});
foreach(结果中的var)
控制台写入线(r.FSTick);
作为记录,此代码肯定是而不是性能方面的


输出:


根据我上面的评论,如果可以将linq sql表达式转换为其扩展方法语法形式,则可以执行以下操作:

为了这个例子,我创建了一个公司列表。公司被定义为

   public class Company
    {
        public string Coverage_status { get; set; }
        public string Exchange { get; set; }
        public string Ticker { get; set; }
    }
下面是代码的完整示例:

 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);
List csvLines=新列表
{
“NASDQ,O,”,
“OTC,O,”,
“纽约证券交易所,N,”,
“谢,T,”
};
var csvValues=csvLines
.选择(l=>new
{
Exchange=l.Split(',').First(),
Lookup=l.Split(',).Skip(1).First()
});
上市公司=新名单
{
新公司{Coverage_status=“aaa”,Ticker=“123”,Exchange=“NASDQ”},
新公司{Coverage_status=“1521drop422”,Ticker=“1251223”,Exchange=“aaaaaa”},
新公司{Coverage_status=“f2hdjjd”,Ticker=“15525221123”,Exchange=“TSE”}
};
var结果=公司
其中(c=>!c.Coverage_status.Contains(“drop”))
.选择(n=>new
{
FSTick=string.Format(“{0}-{1}”),n.Ticker,
CSV值
其中(v=>v.Exchange.Contains(n.Exchange))
.Select(v=>v.Lookup).FirstOrDefault()
});
foreach(结果中的var)
控制台写入线(r.FSTick);
作为记录,此代码肯定是而不是性能方面的


输出:


你能发布公司的任务吗?看起来linq to sql不支持引用由linq语句本身(comp here)构建的集合(序列)。我会将整个表达式转换为等效的linq扩展方法。我不确定是否遵循。公司是我数据库中的一个SQL表。你到底想问什么?@Veverke请你举个例子好吗?我补充了我的答案,但在看到Cetin Bazoz做了几乎相同的事情后(我认为他做得更好,因为有一个可计算的(),所以我删除了我的并更新了他的。我打算暂时取消删除它,以防对您有所帮助。他的解决方案不起作用?不。不幸的是,我没有得到我需要的结果。不过,我没有收到任何错误。您能发布
公司
是什么/它的分配吗?看起来linq to sql不支持引用colle由linq语句本身构建的Action(sequence)(comp here)。我会将整个表达式转换为等效的linq扩展方法。我不确定是否遵循。公司在我的数据库中是一个SQL表。你到底想问什么?@Veverke你能提供一个例子吗?我添加了我的答案,但在看到Cetin Bazoz做了几乎相同的事情后(我认为他的更好,因为有一个可计算的(),所以我删除了我的,并更新了他的。我打算暂时取消删除,以防对您有所帮助。他的解决方案不起作用?没有。不幸的是,我没有得到我需要的结果。但是,我没有得到任何错误。公司表中有大约2000家公司。让我们先从第二个选项开始。我得到一个错误:
名称'comp'在当前环境中不存在。
第一个选项没有给我任何错误。但是,我没有得到我想要的结果。我让美国公司正常工作,但不像东京证交所那样国际化。以下是我得到的结果:
AAPL-O,ALA-
。注意:ALA在东京证交所上市。所以,我应该是获取
ALA-T
。我尝试了你的更新,但仍然没有得到我想要的结果。此外,我认为这个问题只影响了国际市场,但我没有得到场外交易。我现在得到的是:
AAPL-O,ALA-,AMZN-
。我应该得到:
AAPL-O,ALA-T,AMZN-O
。我只更正了你的code。我没有你的数据。如果你以代码的形式提供你的数据,那么我们可以研究什么是代码