Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LinQ查询简单Where子句和许多筛选条件_C#_.net_Linq_Ef Code First_Entity Framework 6 - Fatal编程技术网

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);