在EF中使用string_split和CROSS APPLY

问题描述 投票:0回答:1

是否可以使用 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 中调用系统表值函数?

c# entity-framework linq
1个回答
-2
投票

当然可以将其翻译为 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()
调用的结果。

© www.soinside.com 2019 - 2024. All rights reserved.