【问题标题】:How to Use String Array All Operator in Linq如何在 Linq 中使用字符串数组所有运算符
【发布时间】:2016-05-18 13:10:44
【问题描述】:

我的查询如下:

string[] keys = txtSearch.Text.Split(' ');

var query = (from m in db.Messages
             join r in db.Recievers on m.Id equals r.Message_Id
             where (keys.All(k => (m.MessageText + m.Comments.Select(cmt => cmt.CommentText).ToString()).Contains(k)))
             select m.Id).Distinct();

我收到以下错误:

在查询的 LINQ to SQL 实现中不能使用本地序列 除 Contains() 运算符外的运算符。

【问题讨论】:

  • 似乎您不能将本地源字符串 [] 键与 db 源一起使用,如 where 子句中您正在使用本地源。使用 linq 翻译为 select * from local_source 并尝试
  • @Prathyush,我该如何解决?
  • 附带问题:您希望从Select(cmt => cmt.CommentText).ToString() 得到什么?
  • @IvanStoev,我希望所有 cmets 连接在一起。
  • 如果您期望连接值,那么您的查询不正确,因为 Greg 也提出了相同的建议。

标签: c# linq


【解决方案1】:

问题是您的查询无法转换为 SQL(或者至少提供程序没有被编程为这样做)。如果事实上我不知道查询在 SQL 中的样子:“给我所有这些关键词都包含在文本或 cmets 中的消息”

我的第一个想法是多个请求,每个键值一个:

List<int> allIDs = new List<int>();
foreach(string key in keys)
{
    var query = (from m in db.Messages
                 join r in db.Recievers on m.Id equals r.Message_Id
                 where m.MessageText.Contains(key) || m.Comments.Any(cmt => cmt.CommentText.Contains(key)
                 select m.Id).Distinct();
    allIds.AddRange(query);
}

但您甚至可能需要在单独的查询中搜索消息和 cmets。

显然您更喜欢在一个查询中执行此操作,但我看不出如何在不使用游标的情况下在 SQL 中完成此操作。如果你能想出一条给出正确结果的 SQL 语句,那么直接调用那个 SQL 语句可能比试图想出一个编译成等效 SQL 的 Linq 语句更容易。

【讨论】:

    【解决方案2】:

    使用本地集合时,您只能在 linq to SQL 查询中使用 Array.Contains()

    您需要根据此规则更改您的查询。

    【讨论】:

      【解决方案3】:

      All 运算符返回一个布尔值,它还确定 所有 元素是否满足条件。枚举时,只要不满足条件,枚举就会停止并返回真或假。

      我相信您期待Where 功能,返回所有满足您的搜索匹配的指定元素。

      我认为您没有正确使用查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-18
        • 1970-01-01
        • 2015-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多