【问题标题】:Linq2SQL get value of dynamically chosen columnLinq2SQL 获取动态选择列的值
【发布时间】:2026-02-12 04:40:01
【问题描述】:

我有一个 POCO 类来描述我的模型:

public class Example
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
    public string Prop3 { get; set; }
}

我正在尝试做的是一种扩展方法,使用 Entity Framework DbSets 以这种方式投影我的类:

var qry = db.Examples.Select(x => new {
    Prop1 = x.Prop1,
    Prop2 = x.Prop2,
    Prop3 = x.Prop3,
    Description = XXXXX
}).ToList();

其中 XXXXX 是 Prop1、Prop2 或 Prop3 属性的值,我现在仅在运行时将其名称作为字符串。

我不能使用 Dynamic Linq,因为我的目标是 Entity Framework Core,而且我对 LINQ 表达式越来越着迷,我认为我离解决方案还很远...... 请您提供一些指导好吗?

【问题讨论】:

  • 您是否总是选择 string 类型的 single 属性?
  • 不,如果我在“示例”类中包含一个虚拟的“描述”属性,我需要一个投影,甚至是一个 IQueryable
  • LINQ to Entities 不允许投影到实体类型。并且匿名类型不能创建运行时。看看动态 LINQ。祝你好运。
  • 我不能使用 Dynamic Linq,因为我的目标是 Entity Framework Core...无论如何感谢@Ivan Stoev,并为我之前的误解感到抱歉。

标签: entity-framework linq iqueryable


【解决方案1】:

当您显式获取 Description 的所有需要​​属性时,您可以获取不带 Description 的查询,然后从加载的数据生成所需的查询。

假设设置Description的属性名称存储在name变量中:

var qry1 = db.Examples.Select(x => new {
    Prop1 = x.Prop1,
    Prop2 = x.Prop2,
    Prop3 = x.Prop3,
}).ToList();
var qry = qry1.Select(x => new {
    Prop1 = x.Prop1,
    Prop2 = x.Prop2,
    Prop3 = x.Prop3,
    Description = name == "Prop1"? x.Prop1 : name == "Prop2"? x.Prop2: x.Prop3
}).ToList();

如果你不喜欢硬编码名字,你可以使用反射来获取值:

Description = GetProp(x, name)

GetProp 在哪里:

private string GetProp(object y, string name)
{
   return y.GetType().GetProperty(name).GetValue(y).ToString();
}

【讨论】:

  • 在阅读您的答案之前,我得出了相同的结论。无论如何,这似乎是要走的路。我会尝试反射,因为这个例子是一个简化的场景。在真正的应用程序中,我有 10 个属性可供选择,因此制作 9 个三元运算符表达式对我来说似乎很难看...