2010-08-17 54 views
1

仍然真的在這方面掙扎並且似乎正在圍繞着圈子。動態LINQ倍數在哪裏子句

我有以下代碼,這是驅使我堅果。它應該填充在自動完成文本框使用的項目清單:

public string[] GetAutoComplete(string prefixText, int count) 
    { 
      string memberid = HttpContext.Current.Session["MemberID"].ToString(); 
      string locationid = HttpContext.Current.Session["LocationID"].ToString(); 
      string inhouse = HttpContext.Current.Session["Inhouse"].ToString(); 
      string supplier = HttpContext.Current.Session["Supplier"].ToString(); 
      string groupw = HttpContext.Current.Session["Group"].ToString(); 
      string external = HttpContext.Current.Session["External"].ToString(); 

      MyEnts autocomplete = new MyEnts(); 

      var r = from p in autocomplete.tblAutoCompletes 
         where p.MemberId == memberid && p.LocationId == locationid && p.ACItem.Contains(prefixText) 
         select p.ACItem; 

      if (inhouse == "Inhouse") 
       r = r.Where(p => p == inhouse); 

      if (supplier == "Supplier") 
       r = r.Where(p => p == supplier); 

      if (groupw == "Group") 
       r = r.Where(p => p == groupw); 

      if (external == "External") 
       r = r.Where(p => p == external); 

      r.OrderBy(p => p); 

      return r.ToArray(); 

我試圖檢索與動態,其中沿着以下的線路條款。

如果inhouse =「Inhouse」,那麼項目列表應包含單詞「Inhouse」。如果inhouse!=「Inhouse」,則應將「Inhouse」一詞從列表中排除。

這個相同的邏輯應該適用於不同的地方條款,即供應商,集團,外部。

我真的嘗試了很多不同的方法,但我不能爲我的生活得到的東西工作,這有點令我沮喪。

如果任何人都可以建議這樣做的話,如果我們的路徑跨越,你會得到一個大吻或大冷冰冰的啤酒。

+1

我不明白你的目標,如果'ACItem'包含前綴文本,那麼你肯定會希望所有這樣做。其次,可以從你的代碼中假設ACItem是從你的對象返回的字符串,所以你的後續比較將失敗,除非ACItem是「Inhouse」,「Supplier」,「Group」或「External」。實際上,您正在創建一個例程來爲4個單詞提供自動完成。正如我懷疑的那樣,ACItem比字符串更復雜嗎? – Lazarus 2010-08-17 11:17:03

+0

除了別的,你的訂單什麼都不做 - 你需要'r = r.OrderBy(p => p);' – 2010-08-17 11:22:11

+0

Hello Lazarus(做得很好,從死路上回來,很棒的回來)。 ACItem是一個包含要返回的自動完成項目列表的列。我的場景包括用戶首選項(通過會話),我可能想要限制用戶可以訪問的內容。因此,如果他們不被允許看到Inhouse,自動完成列表將不會顯示這些項目。 如果對我這樣的傻瓜來說不可能,或者非常棘手,我可能會最終將它們留在列表中,並在選擇該項目後進行一些驗證。 – 2010-08-17 11:23:03

回答

1

不完全確定你這裏的問題,但如果你想排除然後不應該的代碼是這樣的

if (inhouse == "Inhouse") 
       r = r.Where(p => p == inhouse); 
else 
       r = r.Where(p => p != inhouse); 

哦!如果你只想排除,則代碼應該是這樣的

if (inhouse != "Inhouse") 
        r = r.Where(p => p != inhouse); 
+0

你可能會在那裏有VinayC。 給你一個大吻! – 2010-08-17 11:33:27

-1

您的每個Where子句都不需要包含Contains標準和一些不包含?

if (inhouse == "Inhouse") 
    r = r.Where(p => p.Contains(inhouse) && !p.Contains("Supplier") && !p.Contains("Group") && !p.Contains("External")); 
0

如果組值包含/排除在編譯時(如出現在你的例子)是已知的,我認爲這是可以可以通過一個查詢進行管理:

string memberid = HttpContext.Current.Session["MemberID"].ToString(); 
string inhouse = HttpContext.Current.Session["Inhouse"].ToString(); 
string supplier = HttpContext.Current.Session["Supplier"].ToString(); 

bool includeInHouse = (inhouse == "Inhouse"); 
bool includeSupplier = (supplier == "Supplier"); 

MyEnts autocomplete = new MyEnts(); 

var r = from p in autocomplete.tblAutoCompletes 
      where (p.MemberId == memberid && p.LocationId == locationid && p.ACItem.Contains(prefixText)) 
      && (includeInHouse || (p.ACItem != "InHouse")) 
      && (includeSupplier || (p.ACItem != "Supplier")) 
      select p.ACItem; 

r.OrderBy(p => p.ACItem); 

return r.ToArray(); 

爲了簡潔起見,我已經刪除了兩個案例。

-1

Sorted。

變種R =從對在autocomplete.tblAutoCompletes 其中p.MemberId == MEMBERID & & p.LocationId == locationid & & p.ACItem.Contains(prefixText) 選擇p.ACItem;

 if (inhouse != "Inhouse") 
      r = r.Where(p => p != "Inhouse"); 

     if (supplier != "Supplier") 
      r = r.Where(p => p != "Supplier"); 

     if (groupw != "Group") 
      r = r.Where(p => p != "Group"); 

     if (external != "External") 
      r = r.Where(p => p != "External"); 

     r = r.OrderBy(p => p); 

     return r.ToArray(); 

我不得不在引號中設置異常,因爲session vlaue不合適,並且不會從列表中挑選任何東西。

感謝所有幫助我的人。

+0

哦,沒有啤酒,沒有吻:( - 很高興你得到它排序:) – 2010-08-17 11:42:46

+0

吉姆 - 保持你的眼睛張貼到我的問題。所有這一切都非常新穎,所以有更多的機會爲啤酒和吻! – 2010-08-17 11:46:42