【问题标题】:How to do a LINQ query with Split operation如何使用拆分操作进行 LINQ 查询
【发布时间】:2013-12-03 17:56:57
【问题描述】:

我有以下 linq 查询:

 MyClass myobj = (from p in Session.All<MyClass>()
                  where p.tags.Split(' ').Contains(searchTag) 
                  select p).FirstOrDefault();

当我运行它时,我得到:

System.NotSupportedException:LINQ to Entities 无法识别 method 'System.String[] Split(Char[])' 方法,而这个方法不能 被翻译成商店表达式。

什么是做我想做的事情的好方法?

【问题讨论】:

  • 我会说,这是不可能的。这不是因为 LINQ,而是因为 SQL 不提供那种功能。你应该考虑改变你的数据库结构并将标签从表中移动到单独的字典中,使用外键链接
  • SQL 本身不支持。
  • 问题是为什么你的tags 列存储标签空格分隔。创建一个新表,每个标签一行。
  • 标准化标签,然后这样做:stackoverflow.com/questions/3478874/…

标签: c# linq


【解决方案1】:

这里真正的问题是数据库设计,但假设您无法控制这一想法,那就是拆分查询。

首先检索任何包含搜索标记的行。

List<MyClass> myobjs = (from p in Session.All<MyClass>()
                        where p.tags.Contains(searchTag) 
                        select p).ToList();

然后对内存中检索到的对象进行正确的标签搜索。

MyClass myobj = myobjs.FirstOrDefault(m => m.tags.Split(' ').Contains(searchTag));

【讨论】:

  • AsEnumerableToList 更可取。
【解决方案2】:

所以,假设 tags = tag1 tag2 tag3,而 searchTag 是 tag2,你可以这样做:

 MyClass myobj = (from p in Session.All<MyClass>()
              where p.tags.IndexOf(searchTag) > -1
              and searchTag.IndexOf(" ") == -1
              select p).FirstOrDefault();

【讨论】:

  • 不确定这是否正确。原帖建议“tags”字段包含一个空格分隔的标签列表,参数“searchTag”应该匹配这个列表中的一个标记。
猜你喜欢
  • 2013-12-02
  • 2017-10-12
  • 2021-02-17
  • 2017-10-29
  • 2014-12-01
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 2014-02-01
相关资源
最近更新 更多