我对以下内容很好奇:

  • 为什么在 中使用 & 字段时,EF Core 无法将其转换static readonly ICollection<T>为查询?删除关键字后,查询似乎可以正常执行?static readonly IList<T>.Contains()static
  • 使用时IEnumerable<T>这不是一个问题,这是因为.Contains()使用不同吗?
  • 这种情况仅当列表/集合为静态时才会发生,为什么查询的翻译如此重要?

我从异常中得到了这个: https: ,但这并不能真正向我解释为什么只有在使用静态集合时才会发生这种情况。

假设在使用 EF Core 时我有这个数据库模型:

public class Item
{
    public string Bar { get; set; }
    public string Foo { get; set; }
}

在我的课堂上,我有以下字段(可以是static readonly IList<T>static readonly ICollection<T>):

private static readonly IList<string> AllowedFooCodes = new List<string>() { "ABC", "CED" };

我的数据库类看起来像这样:

public class SampleDataRepository : ISampleDataRepository
{
    private readonly ILogger<SampleDataRepository> _logger;
    private readonly SampleDataStore _sampleDataStore;

    // Can be IList or ICollection, exception will be thrown regardless.
    private static readonly IList<string> AllowedFooCodes = new List<string>() { "ABC", "CED" };
    
    public SampleDataRepository(SampleDataStore store, ILogger<SampleDataRepository> logger)
    {
        _sampleDataStore = store;
        _logger = logger;
    }
    
    public async Task<IEnumerable<Item>> GetItems()
    {
        _sampleDataStore.Items
                        .AsNoTracking()
                        .Where(item => AllowedFooCodes.Contains(item.foo))
                        .ToListAsync();
    }
}

我期待您的答复。

6

  • 2
    var allowedFooCodes = AllowedFooCodes;如果在查询中添加和使用局部变量有效,那么这可能是一个错误。 使用它作为解决方法并在此处发布问题:


    – 

  • 1
    还尝试将字段转换为静态属性。无论如何,看起来像是一个错误或限制。


    – 

  • 我将该字段更改为私有静态属性,这似乎是一种解决方法,使用局部变量似乎也有效。


    – 


  • 可能是因为当使用非静态字段/变量时,它会强制将变量(或this)作为参数捕获到 lambda 表达式中,而对于静态变量,它会直接通过表达式树。我同意这是一个错误,应该报告。


    – 

  • 1
    我为此提出了一个问题。


    – 


最佳答案
1

看起来这确实是一个错误,看起来已经有一个针对它的 Pull 请求:https: