2016-05-30 213 views
0

我想两次运行下面的LINQ查询,但与除Where子句: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 

有没有办法做到这一点,而不是DRY?没有一个有效的方法来做到这一点,而不用重复新的添加查询?

+0

使用[LinqKit]中的PredicateBuilder(http://www.albahari.com/nutshell/linqkit.aspx) –

回答

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

现在你可以运行此查询的关键字的任意组合。

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

它超级冗长,所以谨慎使用。有时可能太干。