我需要过滤数据实体,但没有预定义的列,我必须对其进行过滤。
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输入值......
答案 0 :(得分:6)
你可以做这样的事情
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();
根据您需要的条件构建查询。
答案 1 :(得分:2)
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);
答案 2 :(得分:1)
我建议您使用Dynamic Linq动态构建查询。
https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library
答案 3 :(得分:1)
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;
答案 4 :(得分:1)
以下为我工作
Exception in thread "main" java.lang.OutOfMemoryError: Required array size too large
at java.nio.file.Files.readAllBytes(Unknown Source)
at Main.main(Main.java:13)
我试过下面的
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;
答案 5 :(得分:1)
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;