2012-02-06 47 views
0

我有一個datagridview,我想要獲得一個基於複選框值(ID保存在複選框標記中)的值的人員列表。這些複選框是由代碼構建,並添加到2個不同的groupboxes(sgbExcursion和sgbLanguage)在多個複選框組上進行篩選

!(http://www.iwva.be/images/ss/ss_listguides.jpg)

如果你只選擇一個偏移(上覆選框),只是一個語言過濾器工作正常。

如果我選擇2種語言(較低的複選框),它將被處理爲「或」。所有講出所選語言的人都會被顯示出來,而不是隻說出兩種選定語言的人。與遊覽相同的問題。

在這裏,我選擇了建立旅遊和語言列表:

List<int> oExcursionID = new List<int>(); 

foreach (Control oControl in sgbExcursion.Controls) 
{ 
    if (oControl.GetType() == typeof(CheckBox)) 
    { 
     CheckBox oCheckBox = (CheckBox)oControl; 
     if (oCheckBox.Checked) 
     { 
      oExcursionID.Add(int.Parse(oCheckBox.Tag.ToString())); 
     } 
    } 
} 

List<int> oLanguageID = new List<int>(); 

foreach (Control oControl in sgbLanguage.Controls) 
{ 
    if (oControl.GetType() == typeof(CheckBox)) 
    { 
     CheckBox oCheckBox = (CheckBox)oControl; 
     if (oCheckBox.Checked) 
     { 
      oLanguageID.Add(int.Parse(oCheckBox.Tag.ToString())); 
     } 
    } 
} 

在這裏,我試圖得到正確的價值觀從數據庫中。語言和遊覽都保存在關係表(Person_ID,Exursion_ID)或(Person_ID,Language_ID)中。

var vGuides = (from oGuideToAdd in clsApplication._oDBConnection.tblGuides 
       where ((from oGuideExcursion in clsApplication._oDBConnection.tblGuideExcursions 
         where oExcursionID.Contains(oGuideExcursion.ExcursionID) 
         select oGuideExcursion.GuideID).Contains(oGuideToAdd.ID) 
       && (from oGuideLanguage in clsApplication._oDBConnection.tblGuideLanguages 
        where oLanguageID.Contains(oGuideLanguage.LanguageID) 
        select oGuideLanguage.GuideID).Contains(oGuideToAdd.ID)) 
       select oGuideToAdd).ToList(); 

什麼可以改變以獲得正確的輸出?

回答

1

我相信,如果你想擁有和代替或者你將不得不做這樣的事情:

,而不是你的內部查詢:

from oGuideExcursion in clsApplication._oDBConnection.tblGuideExcursions 
where oExcursionID.Contains(oGuideExcursion.ExcursionID) 
select oGuideExcursion.GuideID 

做這樣的事情:

public IQueryable<Excursion> GetExcustions(IList<int> excursionIds) 
{ 
    var query = clsApplication._oDBConnection.tblGuideExcursions; 
    foreach(var id in excursionIds) 
    { 
     query = query.Where(x=>x.ExcursionId == id); 
    } 
    return query; 
} 

然後您將其用作:

var guideIdsFromExcustions = GetExcursions(oExcursionsID) 
           .Select(x=>x.GuideID) 
           .Distinct() 
           .ToList(); //ToList is probably optional 

from oGuideToAdd in clsApplication._oDBConnection.tblGuides 
where guideIdsFromExcustions.Contains(oGuideToAdd.GuideID) 

而你對語言也一樣。 這個想法是,當一系列Where子句生成AND語句時,Contains(...)生成OR(實際上它生成IN,但結果相同)。

我不能鼓勵你更多地將巨大的不可讀的查詢語句分成一組簡單的小語句。然後,您可以將它們組合成可讀形式的最終查詢,以便更改,維護和修復錯誤。

1

的問題是,如果只有一種語言是口語行where oLanguageID.Contains(oGuideLanguage.LanguageID)將返回true。

您需要檢查所需語言與口語的交集是否爲空。

您可以使用類似!subset.Except(superset).Any();的地方,其中子集是口頭語言並超出所需的範圍。

查看此鏈接瞭解更多信息Determine if a sequence contains all elements of another sequence using Linq