2017-06-05 33 views
-4

我有一點挑戰,對於mvc我很新。我的問題是,如何在c中編組foreach語句#

我如何分組一堆foreach語句,由它被調用的表的ID。這裏是我的代碼:

foreach (
         var owner in 
          _entities.LLAttrDatas.Where(
           n => n.AttrID == 2 && n.ValStr.Contains(searchInputModel.OwnersName))) 
        { 
         ViewBag.searchName = owner.ValStr; 
        } 

        foreach (
         var ownerAddress in 
          _entities.LLAttrDatas.Where(
           n => n.AttrID == 3 && n.ValStr.Contains(searchInputModel.OwnersAddress))) 
        { 
         ViewBag.searchAddress = ownerAddress.ValStr; 
        } 

        foreach (
         var propertyAddress in 
          _entities.LLAttrDatas.Where(
           n => n.AttrID == 4 && n.ValStr.Contains(searchInputModel.DescriptionOrLocationOfProp))) 
        { 
         ViewBag.searchProperty = propertyAddress.ValStr; 
        } 

        foreach (
         var propertyVolumeNo in 
          _entities.LLAttrDatas.Where(
           n => n.AttrID == 5 && n.ValStr.Contains(searchInputModel.VolumeNumber))) 
        { 
         ViewBag.searchPropertyVolumeNo = propertyVolumeNo.ValStr; 
        } 

        foreach (
         var propertyPlanNo in 
          _entities.LLAttrDatas.Where(
           n => n.AttrID == 6 && n.ValStr.Contains(searchInputModel.SurveyPlanNumber)) 
         ) 
        { 
         ViewBag.searchPropertyPlanNo = propertyPlanNo.ValStr; 
        } 

現在,當用戶針對上述任何查詢進行搜索時,只顯示一個結果。我希望它顯示來自不同查詢的所有結果,因爲它們都具有相同的ID。任何幫助將不勝感激。

謝謝大家的寶貴意見和支持。我們每天學習。不管怎麼說,我發現這樣做的更好的辦法:

public IQueryable<DocumentProperty> GetDocuments(DocumentSearchInputModel searchInputModel) 
      { 
       Context = new DataContext(); 

       if (Context != null) 
       { 
        var result = Context.DocumentsForSearch.AsQueryable();  
        if (searchInputModel != null) 
        { 

         result = 
          Context.DocumentsForSearch.Where(
           d => 
            d.DescriptionOrLocationOfProp.Contains(searchInputModel.DescriptionOrLocationOfProp) 
            || d.OwnersAddress.Contains(searchInputModel.OwnersAddress) 
            || d.OwnersName.Contains(searchInputModel.OwnersName) 
            || d.SurveyPlanNumber.Contains(searchInputModel.SurveyPlanNumber) 
            || d.VolumeNumber.Contains(searchInputModel.VolumeNumber) 
            || d.FileUrl.Contains(searchInputModel.OwnersName)); 

        } 
        Logger.Info($"Results found {result}"); 
        return result; 
       } 
       return null; 
      } 

現在我遇到的唯一問題是如何在視圖中顯示搜索結果。我如何做AttrID和ValStr匹配的foreach,並且如果用戶僅在一個字段中搜索(因爲它是一個多搜索系統),我希望結果顯示具有相同ID的所有字段(即d.ID)。謝謝。

+3

我不知道你在努力完成什麼......但它的錯誤。如此非常錯誤。那些foreach循環應該是火星大小的紅旗給你。 – BradleyDotNET

+0

你爲什麼這樣做?只需要一個'foreach'循環和一些'if' /'else if'語句。 – Kyle

回答

1

你可以這樣做嗎?

foreach(var myProp in _entities.LLAttrDatas) 
{ 
    if(myProp.AttrID == 1 && myProp.ValStr.StartsWith("foo")) 
     // etc.. 
    else if (myProp.AttrID == 2 && myProp.ValStr.StartsWith("bar")) 
     // etc.. 
} 
0

試試這個:

var results = _entities.LLAttrDatas.select(x = > new { 
    owner = x.Where(n => n.AttrID == 2 && n.ValStr.Contains(searchInputModel.OwnersName)).FirstOrDefault(), 
    ownerAddress = x.Where(n => n.AttrID == 3 && n.ValStr.Contains(searchInputModel.OwnersAddress)).FirstOrDefault(), 
    propertyAddress = x.Where(n => n.AttrID == 4 && n.ValStr.Contains(searchInputModel.DescriptionOrLocationOfProp)).FirstOrDefault(), 
    propertyVolumeNo = x.Where(n => n.AttrID == 5 && n.ValStr.Contains(searchInputModel.VolumeNumber)).FirstOrDefault(), 
    propertyPlanNo = x.Where(n => n.AttrID == 6 && n.ValStr.Contains(searchInputModel.SurveyPlanNumber)).FirstOrDefault() 
}).ToList(); 
+0

這真是太棒了。永遠不要使用LINQ,這是不可讀的。我不會低估答案,但這是一個不好的例子,更不用說這是GC/CPU殺手請求。 – eocron

+0

我剛剛從原始發佈複製了Where語句。不知道如何減少where語句,並且不想發佈不起作用的東西。至少我消除了5個冗餘的foreach循環。我懷疑DataSet有5個DataTables,只需索引表就可以。但不確定。 – jdweng

+0

他的表只是鍵值存儲,可能帶有一些額外的元。 AttrID只是搜索模型屬性的別名。它可以簡單地重寫爲映射請求。 – eocron

0

你AttrID顯然是別名在您的搜索模型屬性。正確定義別名表,你會提高可讀性和生成請求的速度:

 var forwardMap = new Dictionary<int, string>() 
         { 
          {2, searchInputModel.OwnersName}, 
          {3, searchInputModel.OwnersAddress}, 
          {4, searchInputModel.DescriptionOrLocationOfProp}, 
          {5, searchInputModel.VolumeNumber}, 
          {6, searchInputModel.SurveyPlanNumber}, 
         }; 

     //common request for all your properties. You can wrap it into function. 
     var query = _entities.LLAttrDatas 
          .GroupBy(x => x.AttrID) 
          .Where(x => forwardMap.Keys.Contains(x.Key)) 
          .Select(x => new 
              { 
               id = x.Key, 
               val = x.FirstOrDefault(y => y.ValStr.Contains(forwardMap[x.Key])) 
              }); 

     //request to server 
     var result = query.ToDictionary(x => x.id, x => x.val); 

     //now result contains corresponding values (don't forget to check them for existance, if they are not present in table, they will not be present in result and throw exception) 
     ViewBag.searchName = result[2]; 
     ViewBag.searchAddress = result[3]; 
     ViewBag.searchProperty = result[4]; 
     ViewBag.searchPropertyVolumeNo = result[5]; 
     ViewBag.searchPropertyPlanNo = result[6]; 
+0

非常感謝,但我有一個類型參數無法從選擇點的使用錯誤中推斷出來。 。選擇(x => new {id = x.AttrID, val = x.FirstOrDefault(y => y.ValStr.Contains(forwardMap [x.AttrId])) }); – user8107351

+0

固定的屬性名稱。 – eocron

+0

固定屬性名稱?請我不明白... – user8107351