使用string_split和CROSS APPLY

时间:2017-01-24 16:55:45

标签: c# entity-framework linq

是否可以使用LINQ to Entities而不是原始SQL来编写此查询?

SELECT *
FROM Articles
CROSS APPLY string_split(Tags, ',')
WHERE value IN ('programming', 'sql')

表格是这样的

CREATE TABLE Articles(Id int IDENTITY(1,1) NOT NULL PRIMARY KEY, Title nvarchar(max) NOT NULL, Tags nvarchar(max) NOT NULL);
INSERT INTO Articles (Title, Tags) VALUES ('First', 'programming,sql');
INSERT INTO Articles (Title, Tags) VALUES ('Second', 'programming,csharp');

更新:使用已定义的表值函数可以SELECT ... CROSS APPLY ...

var tags = new[] { "programming", "sql" };
var articles = from a in db.Articles
               join awt in db.ArticlesWithTags() on a.Id equals awt.Id
               where tags.Contains(awt.Tag)
               select a;

有没有办法在EF中调用系统表值函数?

1 个答案:

答案 0 :(得分:-1)

当然,它可以翻译成LINQ:

var res = from a in db.Articles.AsEnumerable()
          from tag in a.Tags.Split(',')
          select new {
              Id = a.Id,
              Title = a.Title,
              Tags = a.Tags,    // you probably don't want this
              Tag = tag
          };

您当然应该明白,Tags.Split(',')不会直接转换为string_split。而是在SQL中调用SELECT,然后在AsEnumerable()调用的结果中在.NET中执行字符串拆分和新对象创建。