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

6

我有一个包含对EF.Functions.Contains的调用的方法。现在我想使用InMemory数据库为这个方法编写单元测试,但我立即收到以下异常:System.InvalidOperationException : 由于查询已切换到客户端评估,因此不支持'Contains'方法。

我的方法看起来像这样

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

我知道这个异常是由于我的InMemory数据库与生产SQL Server实例上缺少全文索引,但我如何在InMemory数据库上获得相同的索引?

是否有任何方法可以避免这个异常?


一种解决方案是使用:.Where(i => i.Value.Contains(searchString)); - TanvirArjel
@TanvirArjel,很不幸,这不是一个选项,因为这是一个巨大的表格,所以我必须创建一个全文索引。使用您的解决方案,SQL 只会执行 LIKE '%searchstring%' 操作,这绝对不快... - M.G
1个回答

1

就像你所说的,EF.Functions.Contains 不能在内存数据库中使用。

一个解决方法是使用 IsSqlServer() 来检查你是否正在运行 SQL Server 或内存提供程序。

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));

2
编写代码以便通过单元测试并不是一个好主意。因为那个测试证明了什么呢? - CodeCaster
2
@CodeCaster:我同意,这不是一个解决方案,只是对问题的一种权宜之计。事实上,通过这样做,您正在将一个未经测试的if块交付到生产环境中。 - Milnev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接