簡體   English   中英

LINQ查詢以及WHERE子句

[英]LINQ query with addition to WHERE clause

我想運行以下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

有沒有辦法做到這一點而不干? 不使用新添加的內容重復查詢就沒有有效的方法嗎?

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

如果要進行干燥,請參見下面的代碼:

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

現在,您可以使用任何關鍵字組合運行此查詢。

可能在這里過大了,但是在某些情況下,我創建了一個完整的查詢對象,該對象在內部保留了一個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();
    }
}

它非常冗長,因此請謹慎使用。 有時可能會太干。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM