2017-09-04 23 views
2

我有一個SQL表(Product)是這樣的:獲得價值和實體在條件中使用框架

+----+---------+---------+------+----------------+ 
| ID |CompanyID| Name | Code | VisibleFields | 
+----+---------+---------+------+----------------+ 
| 1 | 11 | A | C1 |  ,1,2,  | 
+----+---------+---------+------+----------------+ 
| 2 | 22 | B | C2 |  ,2,  | 
+----+---------+---------+------+----------------+ 

並有enum

public enum Enum_ProductField 
     {        
      Name = 1, 
      Code = 2     
     } 

我在用這個enum此方法:

public override List<Product> GetListProducts(string Name,string Code) 
     {        
      string Name_F = "," + ((int)Product.Enum_ProductField.Name).ToString() + ","; 
      string Code_F = "," + ((int)Product.Enum_ProductField.Code).ToString() + ","; 

      List<Product> retVal = null; 
      using (MarketEntities db = new MarketEntities()) 
      {    
       retVal = (from P in db.Products 
          where         
          (Code == string.Empty || (P.Code == Code && P.VisibleFields.Contains(Code_F))) && 
          (Name == string.Empty || (P.Name.Contains(Name) && P.VisibleFields.Contains(Name_F))) 
          select P).ToList(); 
      } 
      return retVal; 
     } 

如果我撥打GetListProducts("A", string.empty)返回產品ID = 1

如果我打電話GetListProducts("B", string.Empty)返回null,因爲產品的VisibleFieldsID = 2不存在,1,,它不應該被顯示。

我想改變GetListProducts方法和使用Dictionaryenum這樣的:

由1- GetProductFieldAsDictionary

public static Dictionary<T, string> GetProductFieldAsDictionary<T>() where T : struct, IConvertible 
     { 
      var visibleFieldsValues = Enum.GetValues(typeof(T)).Cast<T>().ToDictionary(e => e, e => "," + ((int)(object)e).ToString() + ","); 
      return visibleFieldsValues; 
     } 

創建字典這種方法得到了enumKey返回所有可見字段和Value

2-使用GetProductFieldAsDictionary查詢

public override List<Product> GetListProducts(string Name, string Code) 
     {   
      var _ProductFields = ISTIUtility.GetProductFieldAsDictionary<Product.Enum_ProductField>();    

      List<Product> retVal = null; 
      using (MarketEntities db = new MarketEntities()) 
      {    
       retVal = (from P in db.Products 
          where 
          (Code == string.Empty || (P.Code == Code && P.VisibleFields.Contains(_ProductFields[Product.Enum_ProductField.Code]))) && 
          (Name == string.Empty || (P.Name.Contains(Name) && P.VisibleFields.Contains(_ProductFields[Product.Enum_ProductField.Name]))) 
          select P).ToList(); 
      } 
      return retVal; 
     } 

,但我得到Run-time error,因爲我不能在linq使用Dictionary像上面的代碼。

我不想在linq query之外得到Dictionary的價值。

我看了很多帖子,但是我沒有找到解決方案。有什麼辦法可以使用這個嗎?

回答

0

那麼,你應該能夠做到你以前做的一樣 - 聲明變量,從字典中分配並在查詢中使用它。

public override List<Product> GetListProducts(string Name, string Code) 
{   
    var _ProductFields = ISTIUtility.GetProductFieldAsDictionary<Product.Enum_ProductField>();    

    string Name_F = _ProductFields[Product.Enum_ProductField.Name]; 
    string Code_F = _ProductFields[Product.Enum_ProductField.Code]; 
    List<Product> retVal = null; 
    using (Irandnn_HypermarketEntities db = new Irandnn_HypermarketEntities()) 
    {    
    retVal = (from P in db.Products 
       where 
       (Code == string.Empty || (P.Code == Code && P.VisibleFields.Contains(Code_F))) && 
       (Name == string.Empty || (P.Name.Contains(Name) && P.VisibleFields.Contains(Name_F))) 
       select P).ToList(); 
    } 
    return retVal; 
} 

這裏的要點是,在LINQ不知道該怎麼解釋變量轉換爲SQL查詢,但它知道如何字符串轉換。

+0

我想在'linq'查詢中做到這一點。否則,我可以用舊的方式做到這一點,我不需要字典!!! –

+0

請看問題的標題。我想在'Where Condition'中做到這一點。 –

+0

你的標題並不是說你想直接在查詢中使用字典,所以......好吧,我不會試圖進行深入的討論,所以答案是沒有簡單的解決方案。也許你可以通過編寫自定義表達式來實現,但我並沒有在你的案例中看到這個問題。 – Reniuz