2015-06-27 48 views
1

選擇,我們可以使用下面的查詢檢索利用實體框架的特定列:動態傳遞列名在運行時的實體框架

var result = context.Contents.Where(c => c.CatalogId == "ABC") 
       .Select(c => new {c.ContentId, c.ContentName}); 

我想在運行時通過列名。 我可以在運行時動態地通過這些列名稱{c.ContentId, c.ContentName}

謝謝

回答

2

你必須在運行時構造一個lambda表達式來工作。有些動態LINQ等庫可以爲你做一些工作,而表達式API本身也不會太壞,但我覺得它比這更值得付出努力。最簡單的方式就是回下降到普通的SQL參數化:

var fields = new[] { "ContentId", "ContentName" }; 
var q = "SELECT " + string.Join(", ", fields) + " WHERE CatalogId = @Id"; 

var result = context.Database.SqlQuery<dynamic>(q, new SqlParameter("Id", "ABC")); 

注:請絕對肯定的是,這裏的字段名稱未根據用戶輸入的到來,因爲如果你不這樣做,你重新開放SQL注入。有一些方法可以將查詢扭曲一點,以避免SQL注入(在參數化查詢中添加一個變量,對變量進行切換以選擇字段),但這超出了本答案的範圍。最好完全避免將來自未知源的字符串插入到SQL中。