简体   繁体   English

LinQ查询Simple Where子句和许多过滤条件

[英]LinQ query Simple Where clause and many filter criteria

I need to filter data entity but there is no predefined columns, which I will have to filter. 我需要过滤数据实体,但没有预定义的列,我将不得不过滤。

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

I created all needed properties: SearchFirstName, SearchLastName, SearchNumber 我创建了所有需要的属性:SearchFirstName,SearchLastName,SearchNumber

And now I am trying to filter EventDocument by these parameters entered by user. 现在我试图通过用户输入的这些参数来过滤EventDocument。 If user enters value into SearchFirstName, my query will look like this: 如果用户在SearchFirstName中输入值,我的查询将如下所示:

var query = from b in DBContext.EventDocuments
                    where b.FirstName.Contains(SearchFirstName)
                    select b;

If user enters values to SearchFirstName and SearchLastName, my query will look like this: 如果用户输入SearchFirstName和SearchLastName的值,我的查询将如下所示:

var query = from b in DBContext.EventDocuments
                        where b.FirstName.Contains(SearchFirstName) 
                        && b.LastName.Contains(SearchLastName)
                        select b;

And how to construct query if I don't know - which filed user will fill? 如果我不知道如何构建查询 - 哪个归档用户将填写? Maybe he will enter value to SearchLastName and SearchNumber... 也许他会为SearchLastName和SearchNumber输入值......

You could do something like this 你可以这样做

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

and building your query based on what conditions you need. 并根据您需要的条件构建查询。

Predicate Builder is an effective way. Predicate Builder是一种有效的方法。

Put following code in static PredicateBuilder class , 将以下代码放在静态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);
        }

In your cs file, 在你的cs文件中,

var filterResults = PredicateBuilder.ContainsPredicate<Employee>(columnName, searchName);

And yourLinqQuery.Where(filterResults); yourLinqQuery.Where(filterResults);

For Reference: Predicate Builder Details 供参考: Predicate Builder详细信息

I would recommend you to construct the query dynamically using Dynamic Linq. 我建议您使用Dynamic Linq动态构造查询。

https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library 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;

Below worked for me 以下为我工作

  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;

I tried with below 我在下面尝试过

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM