是否可以使用 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 中调用系统表值函数?
当然可以将其翻译为 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
,然后在 .NET 中执行字符串拆分和新对象创建,作为 AsEnumerable()
调用的结果。