【问题标题】:LINQ 2 SQL - using a C# entity collection and SqlMethods.Like togetherLINQ 2 SQL - 一起使用 C# 实体集合和 SqlMethods.Like
【发布时间】: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


【解决方案1】:

问题是,正如您所提到的,一旦您将SqlMethods.Like 放入filePaths.Any,它就会引发异常。 那是因为 SqlMethods.Like 在 linq-to-entity 中不受支持,而 filePath 是一个实体。

您需要以某种方式动态创建多个带有SqlMethods.LikeOR 语句。

我发现了一个非常相似的问题和一个有趣的答案,应该会有所帮助: How can I add variable count of SqlMethods.Like() in one query?

该解决方案利用了C# 6.0 in a Nutshell中的PredicateBuilder

我相信您可以将您的代码调整为如下内容:
当然,我没有测试代码。

var filePaths = new List<string> { "ab%cd", "ef%gh" };
var likeExpression = PredicateBuilder.False<MetaDataPairClassName>();
foreach (string filePath in filePaths)
{
    likeExpression = likeExpression.Or(mdp => 
    SqlMethods.Like(mdp.Value.ToLower(), filePath));
}

var dbHeaders = from h in _repository.GetHeaders()
                where
                   (from o in h.Objects
                     where 
                        (from mdp in o.MetaDataPairs
                         .Where(mdp.Key == Constants.FilePath)
                         .Where(likeExpression)) 
                         select mdp
                              ).Any()
                     select o).Any()
                select h;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多