2016-05-30 123 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(); 
    } 
} 

它超級冗長,所以謹慎使用。有時可能太乾。