【问题标题】:.Contains() in .Where() EF Core doesn't work .NET Core 3.1.8.Where() 中的 .Contains() EF Core 不起作用 .NET Core 3.1.8
【发布时间】:2021-05-07 00:26:31
【问题描述】:

我有以下代码不起作用:

var bookIds = source.Sids.Split(",");            
     
var hkm = _context.Books
                .Include(b => b.Writer)
                .Where(b => bookIds.Contains(b.SttmId.toString()))
                .ToList();

再澄清一下上面的代码:

// kinda same like the code above (just to clarify what source is):
// This doesn't work
 
var bookIds = "2194".Split(",");    
 
var hkm = _context.Books
                .Include(b => b.Writer)
                .Where(b => bookIds.Contains(b.SttmId.toString()))
                .ToList();
 
// This works
 
var bookIds = 2194;    
 
var hkm = _context.Books
                .Include(b => b.Writer)
                .Where(b => b.SttmId == bookIds))
                .ToList();

b.SttmId 的类型为 Nullable Long:long?

我收到一个奇怪的错误:

---> System.InvalidOperationException:LINQ 表达式 '数据库集 .Where(s => __BooksIds_0 .Contains(b.SttmId.ToString()))' 无法翻译。要么以可翻译的形式重写查询,要么切换 通过插入对任何一个的调用来明确地进行客户评估 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync()。

是我做错了什么还是 EF Core 有什么问题?

【问题讨论】:

  • 我也试过了:Convert.ToString(b.SttmId) 也没有用。
  • b.SttmId 是什么类型?您是否尝试过使您的数组与 db 属性的类型相同?
  • 嗨@CaiusJard 在我提到的问题中,它的类型是long? :)
  • 抱歉,我认为您的编辑与我的评论有冲突——没有看到您这么长时间提及它
  • @OS 您使用的数据库是什么? SQL Server、MySQL、Oracle?

标签: c# asp.net-core .net-core entity-framework-core


【解决方案1】:

这应该可行:

var bookIds = new long[] { 2194 };

var hkm = _context.Books
                  .Include(b => b.Writer)
                  .Where(b => bookIds.Any(x => x == b.SttmId))
                  .ToArray();

如果是这样,您所要做的就是安排一个 long 数组,例如

var bookIds = "1 2 3 4".Split().Select(x => long.Parse(x)).ToArray();

【讨论】:

  • 为什么.Where(b => bookIds.Contains(b.SttmId)) 不起作用?
  • 你是说没有?
  • 这不是 OP 的代码不起作用的原因吗?
【解决方案2】:

我运行了类似的代码,但没有.Include(b => b.Writer)(认为没关系)并且它可以工作。 这可能取决于数据库管理系统或 EntityFrameworkCore 版本吗?我使用 SQL 服务器和 EntityFrameworkCore 3.1.1

【讨论】:

  • 我会试试的。我用EntityFrameworkCore 3.1.8
  • 即使我删除了Include(),仍然是同样的错误。
  • 我可能会尝试升级我的 .NET Core 和实体框架包。
  • @OS 我认为它与您的 .NET/EF 版本无关。我用 EF Core 3.1 运行了你的代码,它可以工作。
  • @atiyar 它确实与 .NET/EF 版本无关。
猜你喜欢
  • 2020-02-22
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 2022-01-30
  • 1970-01-01
  • 2021-03-09
  • 2016-10-10
相关资源
最近更新 更多