2016-02-08 81 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. 构建生成包含您所需的列匿名类型的表达式树