【发布时间】:2017-01-19 11:29:05
【问题描述】:
我有一个标头集合,每个标头都包含一个对象集合,每个对象都包含一个元数据键值对的集合。例如
> Header
> -> Object
> -> Key value pair
> -> Key value pair
> -> Object
> -> Key value pair
> -> Key value pair
我想使用 SQL 通配符(使用 SqlMethods.Like)返回所有包含对象的标头,该对象包含元数据中的某个键值对。
我在下面编写了一个 LINQ 2 SQL 查询,其中包含两个级别的子查询来处理该场景
string filePath = "ab%cd";
var dbHeaders = from h in _repository.GetHeaders()
where
(from o in h.Objects
where
(from mdp in o.MetaDataPairs
where mdp.Key == Constants.FilePath && SqlMethods.Like(mdp.Value.ToLower(), filePath))
select mdp
).Any()
select o).Any()
select h;
这很好用。
当我有一个可能的搜索值列表可供搜索时,问题就出现了。即我想从可能的匹配列表中找到包含元数据值的对象,而不仅仅是单个匹配。我尝试了以下。
var filePaths = new List<string> { "ab%cd", "ef%gh" };
var dbHeaders = from h in _repository.GetHeaders()
where
(from o in h.Objects
where
(from mdp in o.MetaDataPairs
where mdp.Key == Constants.FilePath && filePaths.Any(fp => SqlMethods.Like(mdp.Value.ToLower(), fp))
select mdp
).Any()
select o).Any()
select h;
但是因为 SQLMethods.Like 包含在 Filepaths.Any() 中,所以它不起作用。因为它必须在 LINQ 2 SQL 查询中本地发生。
如何使用 SQL Like 运算符修改顶部查询以匹配,以便它检查字符串搜索标记列表,而不是单个?
更新:下面的错误消息
Assert.IsFalse 失败。发生意外错误:LINQ to Entities 无法识别方法'Boolean Like(System.String, System.String)' 方法,并且该方法不能翻译成 存储表达式。
【问题讨论】:
-
您是否遇到不支持的异常?还是不是预期的结果?
-
错误信息添加到问题
-
也许试试 SqlFunctions.PatIndex(strPattern, target) > 0?我的回忆是 SqlMethods.Like 不适用于 linq to entity
-
我以为上面的查询是LINQ 2 SQL?我是不是很厚,是什么让它 LINQ to entity?
-
我不知道你的设置,但例外是 linq 到实体。我知道 SqlMethods.Like 给我的 linq to entity setup 提供了同样的错误。
标签: c# sql linq linq-to-sql