动态传递要在运行时在实体框架中选择的列名

时间:2015-06-27 17:06:30

标签: c# entity-framework-6

我们可以使用以下查询使用Entity Framework检索特定列:

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

我想在运行时传递列名。 我可以在运行时动态传递这些列名{c.ContentId, c.ContentName}

由于

1 个答案:

答案 0 :(得分:3)

您必须在运行时构造一个lambda表达式才能工作。有一些像Dynamic LINQ这样的库可以为你做一些工作,而Expression 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中。