如何创建一个键是键是一天的字典,价值是对象的列表

发布于 2025-01-31 23:44:33 字数 1277 浏览 2 评论 0 原文

我有以下对象:

public class ExchangeRate
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    [Min(0)]
    public double Value { get; set; }

    [Required]
    public DateTime ValidFrom { get; set; } = DateTime.Now;

    [MaxLength(3)]
    [Required]
    public int CurrencyId { get; set; }
    public virtual CurrencyDto Currency { get; set; }
}

我需要从交换类型列表中创建一个字典,其中密钥是来自有效的日常属性,并且字典中的值是一个交换对象的列表,其中有效Fromfrom propery Day属性等于该属性钥匙。

这是我尝试的:

var exchangeRates = dbContext.ExchangeRates.Where(x => x.ValidFrom.Year == DateTime.Now.Year)
                                           .Where(x => x.ValidFrom.Month == DateTime.Now.Month)
                                           .Where(x => x.ValidFrom.Day >= day)
                                           .GroupBy(k => k.ValidFrom.Day, v => v)
                                           .ToDictionary(x => x.Key, x => x.ToList());

我有以下错误:

system.invalidoperationException:linq expression'DBSET() 。 。 。 .groupby( Keyselector:k => k.validfrom.day, ElementSelector:V => v)'无法翻译。 插入“可忽略的”,“ asasyncenumerable”,“ tolist”或'tolistAsync'。

通过

I have the following object:

public class ExchangeRate
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    [Min(0)]
    public double Value { get; set; }

    [Required]
    public DateTime ValidFrom { get; set; } = DateTime.Now;

    [MaxLength(3)]
    [Required]
    public int CurrencyId { get; set; }
    public virtual CurrencyDto Currency { get; set; }
}

I need to create a dictionary from list of ExchangeRate type, where the key is the day property from ValidFrom, and the value in the dictionary is a list of Exchange objects where the ValidFrom propery day attribute is equal to the key.

This is what I tried:

var exchangeRates = dbContext.ExchangeRates.Where(x => x.ValidFrom.Year == DateTime.Now.Year)
                                           .Where(x => x.ValidFrom.Month == DateTime.Now.Month)
                                           .Where(x => x.ValidFrom.Day >= day)
                                           .GroupBy(k => k.ValidFrom.Day, v => v)
                                           .ToDictionary(x => x.Key, x => x.ToList());

I got the following error:

System.InvalidOperationException : The LINQ expression 'DbSet()
.Where(x => x.ValidFrom.Year == DateTime.Now.Year)
.Where(x => x.ValidFrom.Month == DateTime.Now.Month)
.Where(x => x.ValidFrom.Day >= __day_0)
.GroupBy(
keySelector: k => k.ValidFrom.Day,
elementSelector: v => v)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'.

thnx

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

黑白记忆 2025-02-07 23:44:33

这就是我最后解决的方式:

        var exchangeRates = await dbContext.ExchangeRates.Where(x => x.ValidFrom.Year == DateTime.Now.Year)
                                                         .Where(x => x.ValidFrom.Month == DateTime.Now.Month)
                                                         .Where(x => x.ValidFrom.Day >= day)
                                                         .GroupBy(k => k.ValidFrom.Day, v => v)
                                                         .Select(x => new KeyValuePair<int, List<ExchangeRateDto>>(x.Key, x.ToList()))
                                                         .ToDictionaryAsync(x => x.Key, x => x.Value);

This is how I solved at the end:

        var exchangeRates = await dbContext.ExchangeRates.Where(x => x.ValidFrom.Year == DateTime.Now.Year)
                                                         .Where(x => x.ValidFrom.Month == DateTime.Now.Month)
                                                         .Where(x => x.ValidFrom.Day >= day)
                                                         .GroupBy(k => k.ValidFrom.Day, v => v)
                                                         .Select(x => new KeyValuePair<int, List<ExchangeRateDto>>(x.Key, x.ToList()))
                                                         .ToDictionaryAsync(x => x.Key, x => x.Value);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文