c# 有條件的Linq查詢
5
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();
}
c# linq linq-to-sql .net-3.5
我們正在開發日誌查看器。 用戶可以選擇根據用戶,嚴重程度等進行過濾。在SQL日期中,我將添加到查詢字符串中,但我想用Linq來完成。 我怎樣才能有條件地添加where-clause?
78 votes
c#
說到有條件的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;
}
c#1
76
這樣做:
bool lastNameSearch = true/false; // depending if they want to search by last name,
在where
語句中有這個:
where (lastNameSearch && name.LastNameSearch == "smith")
意味著在創建最終查詢時,如果lastNameSearch
為false
則查詢將完全省略用於姓氏搜索的任何SQL。
c#2
75
我最近有一個類似的要求,最終在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;
c#3
74
您可以使用外部方法:
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將被優化。
c#4
73