簡體   English   中英

具有分組依據和字符串變量的LINQ動態查詢

[英]LINQ Dynamic Query with group by and string variable

我想用LINQ-to-SQL創建一個動態查詢,除一件事情外,其他所有東西都起作用: 我查看了其他問題,但到目前為止還沒有找到不起作用的原因。

我使用using System.Linq.Dynamic; 使用以下查詢(有效):

int numberOfRankedItems = 3;

string minMaxChoice = "max";
string orderBy = "";
if (minMaxChoice == "max")
{
    orderBy = "queryGroup.Sum(row => row.POSITIONVALUE) descending";
} else if (minMaxChoice == "min")
{
    orderBy = "queryGroup.Sum(row => row.POSITIONVALUE) ascending";
}

string minMaxFeatureColumnName = "BRANDNAME";
string selectMinMaxFeature = "new { minMaxFeature = queryGroup.Key." + minMaxFeatureColumnName + ", sumPosition = queryGroup.Sum(row => row.POSITIONVALUE)}";

var query = (from tableRow in Context.xxx
                where /* some filters */
                group tableRow by tableRow.BRANDNAME into queryGroup
                orderby orderBy
                select selectMinMaxFeature).Take(numberOfRankedItems).ToList();

將變量用於orderbyselect可以很好地工作,但是對於group by無論我嘗試用變量替換什么,都可以。 如果我例如使用變量代替tableRow.BRANDNAME ,則查詢實際上可以工作,但是查詢返回錯誤的結果。 目標是能夠動態設置分組的列。

想法?

謝謝

編輯:其他變量似乎也存在多個問題。 因此,我對此問題進行了概括:如何將以下查詢歸納為:

  1. 分組依據的列
  2. 按+ ASC或DESC排序的列
  3. 在select語句中,第一個語句的列名(BRANDNAME)

這是查詢:

var query = (from tableRow in ctx.xxx
                where /* filter */
                group tableRow by new { tableRow.BRANDNAME } into queryGroup
                orderby queryGroup.Sum(row => row.POSITIONVALUE) descending
                select new { minMaxFeature = queryGroup.Key.BRANDNAME, sumPosition = queryGroup.Sum(row => row.POSITIONVALUE) }).Take(numberOfRankedItems).ToList();

沒有表情樹會很好;)

我現在已經闡述了該問題的解決方案:

該解決方案using System.Linq.Dynamic;之前的用法using System.Linq.Dynamic; 現在允許設置某些變量。 最后,它返回一個字典。

// set variables
int numberOfRankedItems;
if (queryData.NumberOfRankedItems != null)
{
    numberOfRankedItems = (int) queryData.NumberOfRankedItems;
} else
{
    numberOfRankedItems = 0;
}
string minMaxChoice = queryData.MinMaxChoice;
string minMaxFeatureColumnName = queryData.MinMaxFeatureColumnName;

string orderByPrompt = "";
if (minMaxChoice == "max")
{
    orderByPrompt = "it.Sum(POSITIONVALUE) descending";
} else if (minMaxChoice == "min")
{
    orderByPrompt = "it.Sum(POSITIONVALUE) ascending";
}

string groupByPrompt = queryData.MinMaxFeatureColumnName;

// execute query
IQueryable query = (from tableRow in Context.xxx
                        where /* some filters */
                        select tableRow).
                        GroupBy(groupByPrompt, "it").
                        OrderBy(orderByPrompt).
                        Select("new (it.Key as minMaxFeature, it.Sum(POSITIONVALUE) as sumPosition)").
                        Take(numberOfRankedItems);

// create response dictionary
Dictionary<int?, Dictionary<string, int?>> response = new Dictionary<int?, Dictionary<string, int?>>();
int count = 1;
foreach (dynamic item in query)
{
    string minMaxFeatureReturn = item.GetType().GetProperty("minMaxFeature").GetValue(item);
    int? sumPositionReturn = item.GetType().GetProperty("sumPosition").GetValue(item);
    response[count] = new Dictionary<string, int?>() { { minMaxFeatureReturn, sumPositionReturn } };
    count++;
}            
return response;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM