2017-04-20 82 views
0

我正在創建一個允許用戶運行SQL SELECT命令的工具,並且結果將顯示在HTML表格中。我正在使用ASP.NET Core MVC,並試圖避免使用SqlConnection/SqlCommand/etc。如果可能的話,直接通過DataContext。在如何返回作爲LINQ-to-SQL查詢結果的匿名對象

"SELECT Id, Name FROM Table"

例如,如果有人類型和結果

Id | Name 
------------ 
1 | 'Bob' 
2 | 'Harry' 

我想Json(results)

[ 
    { Id: 1, Name: "Bob" }, 
    { Id: 2, Name: "Harry"} 
] 

,我想的結果將是類型IEnumerable<object>

我現在就像是

public List<object> RunQuery(string query) 
    { 
     using(MyDbContext context = new MyDbContext()) 
     { 
      return context.MiscTable.FromSql<object>(query).ToList(); 
     } 
    } 

在我倉庫裏的方法,但後來我得到像

$異常的異常{System.InvalidOperationException:所需的列「SomeColumn」不存在於'FromSql'操作的結果中。

其中SomeColumnMiscTable的一些專欄。所以顯然我只能使用FromSql來查詢特定的表。有沒有辦法做我想做的事情?

+0

context.Database.SqlQuery 可能會做你所需要的。 https://msdn.microsoft.com/en-us/library/jj592907(v=vs.113).aspx – Redit0

+0

似乎不存在.NET數據庫核心:( – user7127000

+0

你打算如何訪問對象成員,如果你缺乏類定義? –

回答

1

您不能使用.FromSql與ad-hoc模型。從查詢返回的字段必須完全匹配模型(不缺少字段)

特殊/非實體模型在EF Core中尚不受支持,但在路線圖上。

https://github.com/aspnet/EntityFramework/wiki/Roadmap

原始的SQL查詢的非模型類型允許原始SQL查詢被用來填充不屬於模型(通常用於非規範化視圖模型的數據)的一部分的類型。

另外匿名類不能返回,因爲它們的類型只有在編譯類型時才知道。您應該爲數據庫中的實體創建模型(通常每個表格有一個模型,但您也可以通過繼承在一個表中創建更多模型)。這就是ORM的用途。

如果您只是想要原始查詢,請直接使用ADO.NET。 ORM可以將表映射到類/對象。

0

我相信你可以使用.Include()添加額外的表到您的FromSql操作的dbset。查看此鏈接的示例和其他上下文。

https://docs.microsoft.com/en-us/ef/core/querying/raw-sql#composing-with-linq

從你的榜樣,您的查詢可能是這樣的:

return context.MiscTable.Include(t => t.RelatedTable).FromSql<object>(query).ToList(); 

聲明:我並沒有想這個,所以我不知道它會實際工作。但這似乎是合理的。