如何在LINQ to SQL查询中分离条件?

时间:2011-10-15 11:23:14

标签: c# asp.net sql database linq-to-sql

我正在使用带有C#的ASP.NET,我需要使查询的条件动态化, 例如:
数据库:

 Name       Sex
 --------------
 John Doe    M
 Jane Doe    F

现在我想允许对数据集进行搜索,但如果用户选择按名称或性别进行搜索,则只有查询才允许搜索名称或性别列。但是,如果用户选择按名称和性别进行搜索,则查询将允许按名称和性别列进行搜索。我的问题是我可以使用if语句分隔查询以解释搜索的动态性质吗?谢谢。

2 个答案:

答案 0 :(得分:3)

你可以这样做:

var q = ...;

if(sex != null) {
    q = q.Where(r => r.Sex == sex);
}
if(name != null) {
    q = q.Where(r => r.Name == name);
}

这将根据传入的内容按性别和/或名称进行过滤。

q = q.Where(r => r.Sex == sex).Where(r => r.Name == name);

相同
q = q.Where(r => r.Sex == sex && r.Name == name);

答案 1 :(得分:0)

史蒂文是对的,这是一个很好的简单方法,可以满足您的需求。如果您遇到可能有几个条件语句的情况,那么研究动态linq是明智的。动态linq允许您编写查询,例如:

    DatabaseDataContext db = new DatabaseDataContext();

    string WhereClause = string.Empty;

    if (!string.IsNullOrEmpty(Name))
        WhereClause += "Name.ToLower().Contains(\"" + Name.ToLower() + "\") AND ";

    if (!string.IsNullOrEmpty(State))
        WhereClause += "City.State.Name.ToLower().Contains(\"" + State.ToLower() + "\") AND ";

    if (!string.IsNullOrEmpty(County))
        WhereClause += "City.County.Name.ToLower().Contains(\"" + County.ToLower() + "\") AND ";

    if (!string.IsNullOrEmpty(City))
        WhereClause += "City.Name.ToLower().Contains(\"" + City.ToLower() + "\") AND ";


    if (WhereClause.EndsWith(" AND "))
        WhereClause = WhereClause.Remove(WhereClause.Length - 5);

    var query = db.Communities
                .Where(WhereClause)
                .OrderBy("Name");

您可以在此处获取动态linq课程http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

祝你好运!