有没有一种方法可以将字段添加到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亿行,因此,如果将所有可能的计算字段直接添加到模型中,性能将受到严重打击。
答案 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>();
}
}