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();
您需要将
query.Select(...)
的结果分配给查询变量以实际更改查询,在您不这样做的情况下,您的选择没有任何影响。但是,一旦完成此操作,您将拥有结果投影,其余字段将无法向投影添加更多字段或添加 where 条件。
因此,该方法永远不适用于 Select 语句。您需要构建一个动态表达式树来选择所需的属性。幸运的是,有人已经在这里工作过,请查看您需要@dotlatice答案 imo.
因此,您的代码将是:
- 像现在一样在条件下应用
- 生成一个表达式树,该表达式树生成包含所需列的匿名类型