简体   繁体   English

LINQ查询以及WHERE子句

[英]LINQ query with addition to WHERE clause

I want to run the following LINQ query twice but with an addition to the 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();

This query works fine, but I need to pass an additional parameter to the Where clause: 该查询工作正常,但我需要将附加参数传递给Where子句:

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

Is there a way to do this without being DRY? 有没有办法做到这一点而不干? Isn't there an efficient way of doing this without repeating the query with the 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();

See the code below if you want to be DRY: 如果要进行干燥,请参见下面的代码:

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

Now you can run this query with any combination of keywords. 现在,您可以使用任何关键字组合运行此查询。

Probably overkill here but there have been situations where I've created a full blown query object that internally held an IQueryable and used methods on the object to add the where clause (mostly for letting users filter and sort their results) 可能在这里过大了,但是在某些情况下,我创建了一个完整的查询对象,该对象在内部保留了一个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();
    }
}

It's super verbose so use with caution. 它非常冗长,因此请谨慎使用。 Sometimes it's possible to be too dry. 有时可能会太干。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM