Linq:有條件地給where子句添加條件


Answers

一個選項。

bool? age = null

(from u in DataContext.Users
           where u.Division == strUserDiv 
           && (age == null || (age != null && u.Age > age.Value))
           && u.Height > strHeightinFeet  
           select new DTO_UserMaster
           {
             Prop1 = u.Name,
           }).ToList();

或者你可以切換到linq的方法語法,並使用條件來附加表達式的where子句。

Question

我有這樣的查詢

(from u in DataContext.Users
       where u.Division == strUserDiv 
       && u.Age > 18
       && u.Height > strHeightinFeet  
       select new DTO_UserMaster
       {
         Prop1 = u.Name,
       }).ToList();

我想根據這些條件是否提供給運行此查詢的方法來添加各種條件,如年齡,身高。 所有條件將包括用戶司。 如果年齡提供,我想添加到查詢。 相似,如果提供了高度,我想補充一點。

如果這是使用sql查詢完成的,我會使用字符串生成器將它們追加到主strSQL查詢中。 但是在Linq中,我只能想到使用一個IF條件,在這個條件下,我將三次寫入相同的查詢,每個IF塊都有一個額外的條件。 有一個更好的方法嗎?

謝謝你的時間..




這是我的代碼做類似的事情。 這是我的WCF SOAP Web服務api上的一個方法。

    public FruitListResponse GetFruits(string color, bool? ripe)
    {
        try
        {
            FruitContext db = new FruitContext();
            var query = db.Fruits.Select(f => f);
            if (color != null)
            {
                query = query.Where(f => f.Color == color);
            }
            if (ripe != null)
            {
                query = query.Where(f => f.Ripe == ripe);
            }
            return new FruitListResponse
            {
                Result = query.Select(f => new Fruit { Id = f.FruitId, Name = f.Name }).ToList()
            };
        }
        catch (Exception e)
        {
            return new FruitListResponse { ErrorMessage = e.Message };
        }
    }

基本查詢是Select(f => f) ,這意味著基本上所有事情,並且Where子句可選地附加到它。 最終的Select是可選的。 我使用將數據庫行對象轉換為結果“水果”對象。




基於某些條件,添加條件...

from u in DataContext.Users
where u.Division == strUserDiv 
&& u.Age != null ? u.Age > 18 : 1== 1
&& u.Height != null ? u.Height > 18 : 1== 1
&& u.Height != null ? u.Height > 18 : 1== 1
 select new DTO_UserMaster
       {
         Prop1 = u.Name,
       }).ToList();