有没有一种方法可以将计算字段追加到Select()?

时间:2018-07-24 19:46:52

标签: c# iqueryable

有没有一种方法可以将字段添加到IQueryable(或List <>或其他任何对象)中,而不必重写整个“新的{list,of,all,fields}”。我有一个动态领域,根据情况可以有不同的公式。这是一个基本示例:

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

List<User> users = new List<User>();
users.Add(new User { FirstName = "Foo", LastName = "Bar"} );
users.Add(new User { FirstName = "Bar", LastName = "Foo"} );

我想稍后(在输出之前)添加一个字段,而不删除或重写所有现有字段

var betterUser = users.Select(u => new { FullName = u.FirstName + " " + u.LastName });

这只会返回FullName,但我想保留FirstName和LastName。在我的真实代码中,在添加最后一个字段之前,我将清理大约15个字段和大约12亿行,因此,如果将所有可能的计算字段直接添加到模型中,性能将受到严重打击。

2 个答案:

答案 0 :(得分:1)

您可以这样做

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public object dynamicField {get; set;}
}


List<User> users = new List<User>();
users.Add(new User { FirstName = "Foo", LastName = "Bar"} );
users.Add(new User { FirstName = "Bar", LastName = "Foo"} );

foreach (var obj in users)
{
  obj.dynamicField = obj.FirstName + " " + obj.LastName;
}

这样,您将不必删除或重写所有现有字段。

答案 1 :(得分:1)

您的用户类需要一个属性来执行此操作:但是您可以做到:

public class Animal
{
    public string Name { get; set; }
    public bool HasLegs { get; set; }
    public bool IsFoo { get; set; }
    public string FooLegs { get; set; }
}

private static string legsString(bool hasLegs)
    {
        return hasLegs ? "Has Legs" : "Has No Legs";
    }
    static void Main(string[] args)
    {
        List<Animal> animals = new List<Animal>()
        {
            new Animal()
            {
                Name = "Foo",
                HasLegs = true
            },
            new Animal()
            {
                Name = "Kangaroo",
                HasLegs = true
            },
            new Animal()
            {
                Name = "Snake",
                HasLegs = false
            }

        };

        var fooAnimals = animals.Select(s => new Animal
        {
            Name = s.Name,
            HasLegs = s.HasLegs,
            IsFoo = (s.Name == "Foo" && s.HasLegs),
            FooLegs = $"{s.Name} {legsString(s.HasLegs)}"
        }).AsQueryable<Animal>();
    }
}