使用EF.Functions.Contains()的单元测试方法

时间:2019-04-05 10:00:06

标签: c# entity-framework unit-testing ef-core-2.2

我有一个方法,其中包含对EF.Functions.Contains的调用。现在,我想使用InMemory数据库为该方法编写单元测试,但是我立即收到以下异常System.InvalidOperationException : The 'Contains' method is not supported because the query has switched to client-evaluation.

我的方法看起来像这样

var attributeValues = Context.AssetAttributeValues
                                         .Include(a => a.AssetAttribute)
                                         .Include(a => a.Asset)
                                         .Where(i => EF.Functions.Contains(i.Value, searchString));

我知道引发此异常是因为与生产性SQL Server实例相比,我的InMemory数据库上没有全文索引,但是如何在InMemory数据库上获得相同的索引?

有什么办法可以解决这个异常?

1 个答案:

答案 0 :(得分:0)

就像您说的那样,EF.Functions.Contains不能在InMemory数据库中使用。

一种解决方法是使用IsSqlServer()检查您是针对SQL Server还是InMemory提供程序运行。

if(Context.IsSqlServer())  
    return Context.AssetAttributeValues
                                         .Include(a => a.AssetAttribute)
                                         .Include(a => a.Asset)
                                         .Where(i => EF.Functions.Contains(i.Value, searchString));
else
    return Context.AssetAttributeValues
                                         .Include(a => a.AssetAttribute)
                                         .Include(a => a.Asset)
                                         .Where(i => i.Value.Contains(searchString));