Linq to Sql - 动态列选择

本文关键字:列选 选择 动态 to Sql Linq | 更新日期: 2023-09-27 18:33:50

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

PS:我需要一次选择SKU,供应商名称,供应商样式代码

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

Linq to Sql - 动态列选择

您需要将

query.Select(...)的结果分配给查询变量以实际更改查询,在您不这样做的情况下,您的选择没有任何影响。但是,一旦完成此操作,您将拥有结果投影,其余字段将无法向投影添加更多字段或添加 where 条件。

因此,该方法永远不适用于 Select 语句。您需要构建一个动态表达式树来选择所需的属性。幸运的是,有人已经在这里工作过,请查看您需要@dotlatice答案 imo.

因此,您的代码将是:

  1. 像现在一样在条件下应用
  2. 生成一个表达式树,该表达式树生成包含所需列的匿名类型