簡體   English   中英

有條件或條件為linqtosql的條件

[英]Conditional where with or criteria linqtosql

我想出了如何使用linq to sql進行條件查詢,並且還想出了如何對where子句進行OR。 不幸的是,我無法弄清楚如何一次完成這兩項工作。 我可以做一個條件where子句,例如:

var ResultsFromProfiles = from AllPeeps in SearchDC.aspnet_Users
                          select AllPeeps;


if (SearchFirstNameBox.Checked)
{
    ResultsFromProfiles = ResultsFromProfiles.Where(p => p.tblUserProfile.FirstName.Contains(SearchTerm));
}

if (SearchLastNameBox.Checked)
{
    ResultsFromProfiles = ResultsFromProfiles.Where(p => p.tblUserProfile.LastName.Contains(SearchTerm));
}

這將為我提供任何包含名字和姓氏包含搜索詞的配置文件。

或者我可以做:

var ResultsFromProfiles = from p in SearchDC.aspnet_Users
                          where p.tblUserProfile.LastName.Contains(SearchTerm) ||
                                p.tblUserProfile.FirstName.Contains(SearchTerm)
                          select p;

這將為我提供任何包含名字或姓氏包含搜索詞的配置文件。

我有一堆復選框,用戶可以在其中指定他們想搜索哪些字段,因此我希望能夠構建一個查詢,該查詢將有條件地將它們添加為上面的第一個代碼片段,但是將它們添加為或者,所以它們像第二個片段一樣工作。 這樣,它將在指定字段中的任何位置搜索任何匹配項。

有小費嗎?

是的,請使用PredicateBuilder 它使您可以使用And或Or語義構建動態查詢。 它是免費且穩定的-我在各處使用它。

一種方法是操縱查詢的LINQ表達式樹。 在您的情況下,您需要構建一個lambda表達式並將其替換為對Where的調用。 這是一個基於列表的工作示例,但是無論查詢提供者如何,操縱表達式樹的代碼都是相同的。

List<User> Users = new List<User>();
Users.Add(new User() { FirstName = "John", LastName = "Smith" });
Users.Add(new User() { FirstName = "Jane", LastName = "Smith" });


string Query = "John";

var Queryable = Users.AsQueryable();

var Results = (from u in Queryable
               select u);

//initial method call... the lambda u => false is a place-holder that is about to be replaced
MethodCallExpression WhereExpression = (MethodCallExpression)Results.Where(u => false).Expression;

//define search options
Expression<Func<User, string, bool>> FilterLastName = (u, query) => u.LastName.Contains(query);
Expression<Func<User, string, bool>> FilterFirstName = (u, query) => u.FirstName.Contains(query);

//build a lambda based on selected search options... tie the u parameter to UserParameter and the query parameter to our Query constant
ParameterExpression UserParameter = Expression.Parameter(typeof(User), "u");
Expression Predicate = Expression.Constant(false);  //for simplicity, since we're or-ing, we'll start off with false || ...

//if (condition for filtering by last name)
{
    Predicate = Expression.Or(Predicate, Expression.Invoke(FilterLastName, UserParameter, Expression.Constant(Query)));
}

//if (condition for filtering by first name)
{
    Predicate = Expression.Or(Predicate, Expression.Invoke(FilterFirstName, UserParameter, Expression.Constant(Query)));
}

//final method call... lambda u => false is the second parameter, and is replaced with a new lambda based on the predicate we just constructed
WhereExpression = Expression.Call(WhereExpression.Object, WhereExpression.Method, WhereExpression.Arguments[0], Expression.Lambda(Predicate, UserParameter));

//get a new IQueryable for our new expression
Results = Results.Provider.CreateQuery<User>(WhereExpression);

//enumerate results as usual
foreach (User u in Results)
{
    Console.WriteLine("{0} {1}", u.FirstName, u.LastName);
}

通常,可以通過使用訪客模式來簡化使用表達式樹的工作 ,但是我已經省略了它,因此您可以更清楚地看到必須完成的工作。

這是一個建議。

我沒有嘗試編譯和運行它,LinqToSQL充滿了驚喜,因此不能保證:-)

var ResultsFromProfiles = from AllPeeps in SearchDC.aspnet_Users select AllPeeps;

IEnumerable<AspNet_User> total = new AspNew_User[0];

if (SearchFirstNameBox.Checked)
{    
    total = total.Concat(ResultsFromProfiles.Where(p => p.tblUserProfile.FirstName.Contains(SearchTerm));}
}

if (SearchLastNameBox.Checked)
{
   total = total.Concat(ResultsFromProfiles.Where(p => p.tblUserProfile.LastName.Contains(SearchTerm));
}

total = total.Distinct();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM