[C#] 有條件的Linq查詢



Answers

如果您需要在List / Array上過濾基礎,請使用以下命令:

    public List<Data> GetData(List<string> Numbers, List<string> Letters)
    {
        if (Numbers == null)
            Numbers = new List<string>();

        if (Letters == null)
            Letters = new List<string>();

        var q = from d in database.table
                where (Numbers.Count == 0 || Numbers.Contains(d.Number))
                where (Letters.Count == 0 || Letters.Contains(d.Letter))
                select new Data
                {
                    Number = d.Number,
                    Letter = d.Letter,
                };
        return q.ToList();

    }
Question

我們正在開發日誌查看器。 用戶可以選擇根據用戶,嚴重程度等進行過濾。在SQL日期中,我將添加到查詢字符串中,但我想用Linq來完成。 我怎樣才能有條件地添加where-clause?




我最近有一個類似的要求,最終在MSDN中找到了這個要求。 適用於Visual Studio 2008的CSharp示例

下載的DynamicQuery示例中包含的類允許您在運行時按以下格式創建動態查詢:

var query =
db.Customers.
Where("City = @0 and Orders.Count >= @1", "London", 10).
OrderBy("CompanyName").
Select("new(CompanyName as Name, Phone)");

使用它你可以在運行時動態地創建一個查詢字符串,並將它傳遞給Where()方法:

string dynamicQueryString = "City = \"London\" and Order.Count >= 10"; 
var q = from c in db.Customers.Where(queryString, null)
        orderby c.CompanyName
        select c;



這樣做:

bool lastNameSearch = true/false; // depending if they want to search by last name,

where語句中有這個:

where (lastNameSearch && name.LastNameSearch == "smith")

意味著在創建最終查詢時,如果lastNameSearchfalse則查詢將完全省略用於姓氏搜索的任何SQL。




您可以使用外部方法:

var results =
    from rec in GetSomeRecs()
    where ConditionalCheck(rec)
    select rec;

...

bool ConditionalCheck( typeofRec input ) {
    ...
}

這是可行的,但不能分解為表達式樹,這意味著Linq to SQL會針對每條記錄運行檢查代碼。

或者:

var results =
    from rec in GetSomeRecs()
    where 
        (!filterBySeverity || rec.Severity == severity) &&
        (!filterByUser|| rec.User == user)
    select rec;

這可能在表達式樹中工作,這意味著Linq to SQL將被優化。




說到有條件的linq,我非常喜歡過濾器和管道模式。
http://blog.wekeroad.com/mvc-storefront/mvcstore-part-3/

基本上,你為每個接受IQueryable和一個參數的過濾器案例創建一個擴展方法。

public static IQueryable<Type> HasID(this IQueryable<Type> query, long? id)
{
    return id.HasValue ? query.Where(o => i.ID.Equals(id.Value)) : query;
}



Links