DbContext.DbSet.FromSql()不接受参数

时间:2019-08-14 15:59:17

标签: sql sql-server asp.net-core entity-framework-core

我有一个包含两个表的数据库,并编写了一个相对简单的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,这就是我所做的。

我不知道我在做什么错。

2 个答案:

答案 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}%'
...