我正在研究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();
答案 0 :(得分:0)
您需要将query.Select(...)
的结果分配给查询变量以实际更改查询,在您的情况下,您不会这样做,因此您的选择不会产生任何影响。但是一旦你这样做,你将得到结果的投影,其余的字段既不能用于向投影添加更多字段,也不能添加条件。
因此该方法永远不会适用于Select语句。您需要构建动态表达式树来代替所需的属性。幸运的是,有人已经开始研究here,请查看@dotlatice的答案,这就是你需要的东西。
所以,你的代码是: