2016-02-08 92 views
1

Iam在Linq-to-Sql上試圖獲取傳遞給動態obj參數的列名(每次更改)。我需要選擇定義動態OBJ數組的列名。Linq to Sql-動態列選擇

PS:我需要選擇SKU,VENDORNAME,vendorstylecode一次

「where」子句條件,工作正常,但我需要選擇定義data.col指數

我試過以下特定的列代碼,但不幫助我:

public HttpResponseMessage PostGenerateFile([FromBody] dynamic data) { 
string[] vendorname = data.vendorname != null ?data.vendorname.ToObject<string[]>() : null; 
string[] brandname = data.brandname != null ? data.brandname.ToObject<string[]>() : null; 

using (var context = new Vendor_InvDataContext()) 
     { var query = context.AllInventories.AsQueryable(); 


      for (int i = 0; i < data.col.Count; i++) 
      { 
       if(data.col[i]=="SKU") 
        query.Select(s => s.SKU); 
       if (data.col[i] == "VENDORNAME") 
        query.Select(s => s.VENDORNAME); 
       if (data.col[i] == "VENDORSTYLECODE") 
        query.Select(s => s.VENDORSTYLECODE); 
       if (data.col[i] == "STYLECODE") 
        query.Select(s => s.STYLECODE); 
       if (data.col[i] == "STYLENAME") 
        query.Select(s => s.STYLENAME); 
      } 

if (vendorname != null && vendorname.Length > 0) 
      { 
       query = query.Where(s => vendorname.Contains(s.VENDORNAME)); 
      } 
      if (brandname != null && brandname.Length > 0) 
      { 
       query = query.Where(s => brandname.Contains(s.BRANDNAME)); 
      } 
var items = query.ToList(); 

回答

0

您需要分配的query.Select(...)結果查詢變量來真正改變的查詢,在你的情況,你不這樣做你的選擇沒有任何效果。但是一旦你這樣做了,你將會得到一個結果投影,其餘的字段將不能用於向投影添加更多的字段,也不能添加條件。

因此,這種方法將永遠不會用於Select語句。您需要構建動態表達式樹來選擇所需的屬性。幸運的是,有人已經在這個here上工作,請看@dotlatice的答案,這是你需要的IMO。

所以,你的代碼是:

  1. 應用where條件,你現在所做的
  2. 構建生成包含您所需的列匿名類型的表達式樹