C# LinQ查询简单Where子句和许多筛选条件
我需要过滤数据实体,但没有预定义的列,我必须过滤这些列C# LinQ查询简单Where子句和许多筛选条件,c#,.net,linq,ef-code-first,entity-framework-6,C#,.net,Linq,Ef Code First,Entity Framework 6,我需要过滤数据实体,但没有预定义的列,我必须过滤这些列 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 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输入值,我的查询将如下所示:
var query = from b in DBContext.EventDocuments
where b.FirstName.Contains(SearchFirstName)
select b;
var query = from b in DBContext.EventDocuments
where b.FirstName.Contains(SearchFirstName)
&& b.LastName.Contains(SearchLastName)
select b;
如果我不知道该如何构造查询-哪个字段的用户将填写?也许他会为SearchLastName和SearchNumber输入值…我建议您使用动态Linq动态构造查询
你可以这样做
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();
并根据您需要的条件构建查询。下面的内容适合我
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;
List lsteventDoc=new List(){
新事件文档{ID1=“1”,ID2=2,FirstName=“”,LastName=“Test”,Number=“1”},
新的事件文档{ID1=“1”,ID2=2,FirstName=“test”,LastName=“test”,Number=“1”},
新事件文档{ID1=“1”,ID2=2,FirstName=“”,LastName=“”,Number=“1”},
};
字符串SearchFirstName=“test”;
字符串SearchLastName=“Test”;
字符串SearchNumber=“1”;
var query=来自lsteventDoc中的b
其中(b.FirstName.Contains(SearchFirstName)&(!string.IsNullOrEmpty(SearchFirstName)))
&&(b.LastName.Contains(SearchLastName)&(!string.IsNullOrEmpty(SearchLastName)))
&&(b.Number.Contains(SearchNumber)&(!string.IsNullOrEmpty(SearchNumber)))
选择b;
谓词生成器是一种有效的方法
将以下代码放入静态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);
}
公共静态表达式ContainsPredicate(string memberName,string searchValue)
{
var参数=表达式参数(类型为(T),“m”);
var member=Expression.PropertyOrField(参数,memberName);
var body=Expression.Call(
委员:,
“包含”,
Type.EmptyTypes,//无泛型类型参数
表达式.常量(searchValue)
);
返回表达式.Lambda(主体,参数);
}
在您的cs文件中
var filterResults = PredicateBuilder.ContainsPredicate<Employee>(columnName, searchName);
var filterResults=PredicateBuilder.ContainsPredicate(columnName,searchName);
和yourLinqQuery.Where(filterResults)代码>
供参考:考虑在答案中包含代码片段,可以删除在线资源。谢谢,我没有正确完成我的问题。现在我做的和你写的一样。。。但也在寻找如何解决这种情况,而不是使用lambdas…仅仅因为我感兴趣。为什么你不想使用lambdas?事实上,我正在尝试过滤大量记录并以最快的方式进行搜索(也需要连接两个表…不幸运),我将能够定义搜索机制,这取决于用户将发布的速度,如果你怀疑,我想应该没有什么不同。也许会help@Songaila:无论使用方法还是查询语法,性能都没有差别。查询语法将被转换为方法语法,因为它只是语法sugar.Hello。若用户只输入SearchFirstName呢?你们能建议在这里写什么来代替columnName吗:var filterResults=PredicateBuilder.ContainsPredicate(columnName,searchName);你能详细说明一下吗。我找不到你。根据代码,您可以将员工属性作为columnName传递。你在等这个吗?谢谢,我至少明白了,我把columnName作为字符串参数传递了。。现在我将尝试传递参数和成员名列表
var filterResults = PredicateBuilder.ContainsPredicate<Employee>(columnName, searchName);