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

时间:2017-05-04 11:33:59

标签: 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 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输入值......

6 个答案:

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

供参考: Predicate Builder Details

答案 2 :(得分:1)

答案 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;