Linq to Sql-动态列选择

时间:2016-02-08 10:36:26

标签: c# sql-server linq dynamic

我正在研究Linq-to-Sql试图获取传递动态obj参数的列名(每次更改)。我需要选择定义动态obj数组的列名。

P.S:我需要立刻选择sku,vendorname,vendorstylecode

"其中"子句条件工作正常但我需要选择在data.col index

中定义的特定列

我尝试了以下代码,但没有帮助我:

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();

1 个答案:

答案 0 :(得分:0)

您需要将query.Select(...)的结果分配给查询变量以实际更改查询,在您的情况下,您不会这样做,因此您的选择不会产生任何影响。但是一旦你这样做,你将得到结果的投影,其余的字段既不能用于向投影添加更多字段,也不能添加条件。

因此该方法永远不会适用于Select语句。您需要构建动态表达式树来代替所需的属性。幸运的是,有人已经开始研究here,请查看@dotlatice的答案,这就是你需要的东西。

所以,你的代码是:

  1. 适用于您现在正在执行的条件
  2. 构建一个表达式树,生成包含所需列的匿名类型