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

C# 在实体框架中动态传递要在运行时选择的列名,c#,entity-framework-6,C#,Entity Framework 6,我们可以使用以下查询使用实体框架检索特定列: var result = context.Contents.Where(c => c.CatalogId == "ABC") .Select(c => new {c.ContentId, c.ContentName}); 我想在运行时传递列名。 我可以在运行时动态传递这些列名吗 谢谢您必须在运行时构造lambda表达式才能工作。有一些库,比如DynamicLinq,可以为您做一些工作,而且表达式API本身

我们可以使用以下查询使用实体框架检索特定列:

var result = context.Contents.Where(c => c.CatalogId == "ABC")
                .Select(c => new {c.ContentId, c.ContentName});
我想在运行时传递列名。 我可以在运行时动态传递这些列名吗


谢谢

您必须在运行时构造lambda表达式才能工作。有一些库,比如DynamicLinq,可以为您做一些工作,而且表达式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"));
var fields=new[]{“ContentId”,“ContentName”};
var q=“SELECT”+string.Join(“,”字段)+“WHERE CatalogId=@Id”;
var result=context.Database.SqlQuery(q,新的SqlParameter(“Id”,“ABC”));
注意:绝对要确保这里的字段名不是来自用户输入,因为如果你不这样做,你就是在向SQL注入敞开大门。有一些方法可以稍微扭曲查询以避免SQL注入(在查询中添加一个参数化的变量,对变量进行大小写切换以选择字段),但这超出了本答案的范围。最好完全避免将未知源的字符串插入SQL