簡體   English   中英

C# 如何用 IQueryable 定義匿名類型?

[英]C# how to define an anonymous type with IQueryable?

根據開關/情況,變量設置為 EF 鏈接。 但我不知道如何定義變量groupByLeadIdQuery

IQueryable groupByLeadIdQuery = null;

switch (...)
{
    case ...:
    {
         groupByLeadIdQuery = context.HistoryRecords.GroupBy(h => h.ProductId)
         .Select(g => new
         {
              Id = g.Key,
              Retributions = g.Sum(s => s.Retribution),
         });
    }
    break;
    case ...:
    {
        groupByLeadIdQuery = null;
    }
    ...
}

稍后在代碼中,我根據變量是否為 null 來處理結果

if (groupByLeadIdQuery2 != null)
{
    var list = groupByLeadIdQuery2.ToList(); <<<<<<<<<<<<<<<<<<
    ...
}

編譯器抱怨: IQueryable 不包含 ToList 的定義

我試過了

IQueryable<T> groupByLeadIdQuery = null;
IQueryable<Anonymous> groupByLeadIdQuery = null;
IQueryable<'a> groupByLeadIdQuery = null;
var groupByLeadIdQuery = null;

沒有任何作用。

你能啟發我嗎?

感謝您的幫助

要擁有 ToList 方法,您應該將 IQueryable 變量定義為 List。 例如IQueryable<Product>或類似的東西。 如果沒有特定類型,您可以只使用 var 並獲取您的匿名類型。

在您的情況下,我認為最簡單的解決方案是設置默認值,而不是按情況更新。 但是在這種情況下,您必須為每種情況設置相同的匿名類型,否則您必須強制轉換類型。

 var groupByLeadIdQuery = context.HistoryRecords.GroupBy(h => h.ProductId)
     .Select(g => new
     {
          Id = g.Key,
          Retributions = g.Sum(s => s.Retribution),
     });
switch (...)
{
case ...:
{
     groupByLeadIdQuery = ...;
}
break;
case ...:
{
    groupByLeadIdQuery = null;
}
...
}

如果這不能解決您的問題,您應該使用接口,一個包含您需要的屬性的接口,或者可能是動態。

切換表達式在這里可能是一個不錯的選擇。 根本問題是您需要IQueryable<T> <T>中的 <T> ,但它是“不可發音的”,因此您只能使用var來聲明它,但是:

var query = whatever switch {
    SomeCase => your.Query.Here...,
    _ => null,
};

請注意,雖然您可以根據需要擁有盡可能多的案例行,但它們必須具有相同的形狀才能正常工作。

您可以使通用Group By方法如下所示:

 public async Task<List<T>> GetGroupByResult<T>(string groupByItem) where T : class
        {
            var groupByLeadIdQuery = _dbContext.Set<T>();

            switch (groupByItem)
            {
                case "ProductId":
                {
                        groupByLeadIdQuery = groupByLeadIdQuery.GroupBy(h => h.ProductId)
                            .Select(g => new
                            {
                                Id = g.Key,
                                Retributions = g.Sum(s => s.Retribution),
                            });

                        break;
                }
                case "Other":
                {
                    groupByLeadIdQuery = ...;

                    break;
                }
                default:
                    {
                        groupByLeadIdQuery = null;
                    }
            }

            if (groupByLeadIdQuery != null)
                return await groupByLeadIdQuery.ToListAsync();

            return default;
        }

它可以用於您的任何實體。

來自大王

groupByLeadIdQuery2.Cast<dynamic>().ToList() 

奇跡般有效

暫無
暫無

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

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