[英]LinQ query Simple Where clause and many filter criteria
我需要過濾數據實體,但沒有預定義的列,我將不得不過濾。
public class EventDocument
{
public string ID1 { get; set; }
public int ID2 { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Number { get; set; }
public virtual ICollection<Event> Events { get; set; }
}
我創建了所有需要的屬性:SearchFirstName,SearchLastName,SearchNumber
現在我試圖通過用戶輸入的這些參數來過濾EventDocument。 如果用戶在SearchFirstName中輸入值,我的查詢將如下所示:
var query = from b in DBContext.EventDocuments
where b.FirstName.Contains(SearchFirstName)
select b;
如果用戶輸入SearchFirstName和SearchLastName的值,我的查詢將如下所示:
var query = from b in DBContext.EventDocuments
where b.FirstName.Contains(SearchFirstName)
&& b.LastName.Contains(SearchLastName)
select b;
如果我不知道如何構建查詢 - 哪個歸檔用戶將填寫? 也許他會為SearchLastName和SearchNumber輸入值......
你可以這樣做
var query = DBContext.EventDocuments;
if(!string.IsNullOrEmpty(SearchFirstName))
{
query = query.Where(x => x.FirstName.Contains(SearchFirstName));
}
if(!string.IsNullOrEmpty(SearchLastName))
{
query = query.Where(x => x.LastName.Contains(SearchLastName));
}
var result = query.ToList();
並根據您需要的條件構建查詢。
Predicate Builder是一種有效的方法。
將以下代碼放在靜態PredicateBuilder類中 ,
public static Expression<Func<T, bool>> ContainsPredicate<T>(string memberName, string searchValue)
{
var parameter = Expression.Parameter(typeof(T), "m");
var member = Expression.PropertyOrField(parameter, memberName);
var body = Expression.Call(
member,
"Contains",
Type.EmptyTypes, // no generic type arguments
Expression.Constant(searchValue)
);
return Expression.Lambda<Func<T, bool>>(body, parameter);
}
在你的cs文件中,
var filterResults = PredicateBuilder.ContainsPredicate<Employee>(columnName, searchName);
和yourLinqQuery.Where(filterResults);
我建議您使用Dynamic Linq動態構造查詢。
https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library
var query = from eventDocument in DBContext.EventDocuments
where string.IsNullOrEmpty(firstName) || eventDocument.FirstName.Contains(firstName)
&& string.IsNullOrEmpty(lastName) || eventDocument.LastName.Contains(lastName)
&& string.IsNullOrEmpty(number) || eventDocument.Number.Contains(number)
select eventDocument;
以下為我工作
var query = from b in DBContext.EventDocuments
where (b.FirstName.Contains(SearchFirstName) && (!string.IsNullOrEmpty(SearchFirstName))
&& (b.LastName.Contains(SearchLastName) && (!string.IsNullOrEmpty(SearchLastName))
&& (b.SearchNumber.Contains(SearchNumber) && (!string.IsNullOrEmpty(SearchNumber))
select b;
我在下面嘗試過
List<EventDocument> lsteventDoc = new List<EventDocument>() {
new EventDocument{ID1 ="1", ID2=2, FirstName ="", LastName="Test", Number="1"},
new EventDocument{ID1 ="1", ID2=2, FirstName ="test", LastName="Test", Number="1"},
new EventDocument{ID1 ="1", ID2=2, FirstName ="", LastName="", Number="1"},
};
string SearchFirstName = "test";
string SearchLastName="Test";
string SearchNumber="1";
var query = from b in lsteventDoc
where (b.FirstName.Contains(SearchFirstName) && (!string.IsNullOrEmpty(SearchFirstName)))
&& (b.LastName.Contains(SearchLastName) && (!string.IsNullOrEmpty(SearchLastName)))
&& (b.Number.Contains(SearchNumber) && (!string.IsNullOrEmpty(SearchNumber)))
select b;
var query = from b in DBContext.EventDocuments
where (b.FirstName.Contains(SearchFirstName) || SearchFirstName == "")
&& (b.LastName.Contains(SearchLastName) || SearchLastName == "")
&& (b.Number.Contains(SearchNumber) || SearchNumber == "")
select b;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.