【问题标题】:Create a LINQ expression for SELECT sentence为 SELECT 语句创建 LINQ 表达式
【发布时间】:2016-06-15 13:52:02
【问题描述】:

我有这个 LINQ 查询,其中 "new" 语句 创建了一个匿名类型

var query = from x in List
            select new {x.Field1, x.Field2};

如何动态构建 LINQ 表达式:

select new {x.Field1, x.Field2};

更多内容:

我们有一个 List,其中 Customer 具有属性 A、B、C、D、E、F、G。

有时我们只需要返回一些属性:

第一次调用返回:

 select new {x.A, x.B}

第二次调用返回:

 select new {x.C, x.D}

返回是动态的!我有字符串数组中的属性名称。

谢谢!

【问题讨论】:

  • 您能详细说明一下吗?这个问题不是很清楚。
  • 为什么要标记EF,这种情况下你用的吗?
  • 嗨@YacoubMassad,我需要创建LINQ 表达式,所以我可以调用“Select(linqExpression)”之类的“Select”方法
  • 是的。但是你将如何消费结果呢?您是否期望 C# 会推断出 query 的类型并让您继续构建查询?您能否展示一个预期的使用示例,突出您将如何使用输出?
  • 所以你真的不关心输出的类型,只关心它被序列化为 JSON 时的样子,对吧?

标签: c# entity-framework linq lambda expression-trees


【解决方案1】:

假设您要检索的属性为 CSV。你应该可以使用这个。

public static class ObjectExtensions
{
    public static Dictionary<string,object> GetProperties(this object obj, string properties)
    {
        var propertyNames = properties.Split(',');
        var result = new Dictionary<string, object>();
        var type = obj.GetType();
        foreach (var property in propertyNames)
        {
            var prop = type.GetProperty(property);
            var value = prop.GetValue(obj);
            result.Add(property, value);
        }
        return result;
    }
}

它将键值对存储在字典中

用法是。

 var result = list.Select(p => p.GetProperties("Field1,Field2"));
 JsonSerializer.CreateDefault().Serialize(Console.Out, result);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    相关资源
    最近更新 更多