除了WHERE子句之外的LINQ查询

时间:2016-05-30 18:45:38

标签: c# linq linq-to-sql

我想运行以下LINQ查询两次,但添加了Where子句:

var TickList = 
    (from comp in Companies
    join eqRes in Equity_issues on comp.Ticker equals eqRes.Ticker
    where !comp.Coverage_status.Contains("dropp") 
        && !comp.Coverage_status.Contains("Repla") && eqRes.Primary_equity.Equals('N')
     select new 
    {
        LocalTick = eqRes.Local_ticker.Trim(),
        Exchange = eqRes.Exchange_code.Contains("HKSE") ? "HK" : (eqRes.Exchange_code.Contains("NSDQ") ? "NASDQ" : eqRes.Exchange_code),
        Ticker = comp.Ticker.Trim()
    }).ToList();

此查询工作正常,但我需要将另一个参数传递给Where子句:

where !comp.Coverage_status.Contains("dropp") 
        && !comp.Coverage_status.Contains("Repla") && eqRes.Primary_equity.Equals('N')
        && !comp.Coverage_status.Contains("Intl")  <--- new addition

有没有办法在没有干的情况下做到这一点?难道没有一种有效的方法可以做到这一点,而无需使用新添加重复查询吗?

3 个答案:

答案 0 :(得分:1)

// select additional Intl field (similar to Exchange)
var TickList = 
    (from comp in Companies
    join eqRes in Equity_issues on comp.Ticker equals eqRes.Ticker
    where !comp.Coverage_status.Contains("dropp") 
        && !comp.Coverage_status.Contains("Repla") && eqRes.Primary_equity.Equals('N')
     select new 
    {
        LocalTick = eqRes.Local_ticker.Trim(),
        Exchange = eqRes.Exchange_code.Contains("HKSE") ? "HK" : (eqRes.Exchange_code.Contains("NSDQ") ? "NASDQ" : eqRes.Exchange_code),
        Intl = comp.Coverage_status.Contains("Intl") ? 1 : 0,
        Ticker = comp.Ticker.Trim()
    }).ToList();

// use LINQ to objects to filter results of the 1st query
var intl = TickList.Where(x => x.Intl = 0).ToList();

答案 1 :(得分:0)

如果你想要干,请参阅下面的代码:

var keywords = new string[] { "dropp", "Repla", "Intl" };

var TickList = Companies
    .Join(Equity_issues, c => c.Ticker, e => e.Ticker, (c, e) => new { c, e })
    .Where(ce => ce.e.Primary_equity.Equals('N')
                 && keywords.All(v => !ce.c.Coverage_status.Contains(v)))
    .Select(ce => new 
     {
        LocalTick = ce.e.Local_ticker.Trim(),
        Exchange = ce.e.Exchange_code.Contains("HKSE")
                   ? "HK"
                   : (ce.e.Exchange_code.Contains("NSDQ")
                     ? "NASDQ"
                     : ce.e.Exchange_code),
        Ticker = ce.c.Ticker.Trim()
     })
    .ToList();

现在,您可以使用任意关键字组合运行此查询。

答案 2 :(得分:0)

这里可能有点过分,但有些情况我已经创建了一个完整的查询对象,在对象内部持有IQueryable和使用的方法来添加where子句(主要是为了让用户过滤和排序他们的结果)

public class TickList{
    IQueryable<Foo> _query;
    public TickList(){
        _query = from comp in Companies
                 join eqRes in Equity_issues on comp.Ticker equals eqRes.Ticker
                 select new Foo {
                     LocalTick = eqRes.Local_ticker.Trim(),
                     Exchange = eqRes.Exchange_code.Contains("HKSE") ? "HK" :(eqRes.Exchange_code.Contains("NSDQ") ? "NASDQ" : eqRes.Exchange_code),
                     Ticker = comp.Ticker.Trim()
                 };
    }
    public void WhereCoverageContains(string text){
        _query = _query.Where(x => x.Coverage_Status.Contains(text));
    }
    public void WherePrimaryEquityIs(string text){
        _query = _query.Where(x => x.PrimaryEquity.Equals(text));
    }
    public List<Foo> ToList(){
        return _query.ToList();
    }
}

它的超级详细,所以请谨慎使用。有时可能会太干燥。