我有一个包含两个表的数据库,并编写了一个相对简单的select语句,该语句结合了数据并向我返回了我想要的字段。在我的SQL开发人员软件中,它执行得很好。
现在要在我的C#.NET Core应用程序中执行它,我在DbContext中创建了一个“伪” DbSet,该数据库上没有正确的表。 DbSet的类型是一个模型,代表select语句的结果数据结构。我使用DbSet字段访问方法FromSql()
并执行如下选择:
List<ProjectSearchModel> results = _ejContext.ProjectSearch.FromSql(
@"SELECT combined.Caption, combined.Number FROM
(SELECT p.Caption, p.Number, CreateDate FROM dbo.Project AS p
UNION
SELECT j.Caption, j.Number, CreateDate FROM dbo.Job AS j) AS combined
WHERE combined.Caption LIKE '{0}%' OR combined.Number LIKE '{0}%'
ORDER BY combined.CreateDate DESC
OFFSET 0 ROWS
FETCH FIRST 30 ROWS ONLY", term)
.ToList();
SQL已经正确地返回了数据,我已经测试过了。但是result
变量在执行后保留0个条目。在FromSql()
的文档中,我发现对于MS SQL Server,在使用OFFSET 0
时必须使用ORDER BY
,这就是我所做的。
我不知道我在做什么错。
答案 0 :(得分:1)
您需要改用DbQuery<T>
:
public DbQuery<Project> ProjectSearch { get; set; }
然后,您可以使用FromSql
对此发出任意查询。使用DbSet
时,查询必须是可组合的,这意味着它只能是标准选择,它必须对应于真实表,并且必须包含实体上的所有属性-这些都不适用于您要查询的对象试图表演。
答案 1 :(得分:0)
正如@ChrisPratt所说,我的错误之一是使用DbSet
类而不是DbQuery
类。但是,令我疯狂的是我的参数不起作用。我的错误是将它们放在字符串中,这导致它们无法被识别为参数。所以我的SQL字符串应该是
...
WHERE combined.Caption LIKE {0} + '%' OR combined.Number LIKE {0} + '%'
...
代替
...
WHERE combined.Caption LIKE '{0}%' OR combined.Number LIKE '{0}%'
...