【发布时间】:2016-09-15 12:34:28
【问题描述】:
我想将字段连接成一个非字段,它是同一模型的属性。
我有一个 Person 的模型,其中包括一个名为 FullName 的非字段属性 (NotMapped):
public class Person
{
public int Id{get;set;}
public string firstname{get;set;}
public string lastname{get;set;}
[NotMapped]
public string FullName{get;set;}
}
现在我想选择所有人及其FullName
FullName = string.format("{0} {1}",firstname, lastname);
我不想在列出表格后为每个人分配全名,因为性能和速度都不好(大约 10K 记录)
我不想使用如下的新选择(动态类型)
var list = from pf in db.Persons
select new
{
Person = pf,
FullName = string.format("{0} {1}", pf.firstname, pf.lastname)
}
List<Person> persons = new List<Person>();
// bad performance
foreach(var item in list)
{
item.Person.FullName = item.FullName;
persons.Add(item);
}
除非你为它提供一个动态 lambda 函数,它具有通用模型类型和连接字段公式的表达式。
例如:
public List<TModel> GetList<TModel>(Expression<Func<TModel, string>> cField = null,...)
{
//all should done in database side with one query
//select all records include FullName
}
我不想使用 FullName.get
public string FullName
{
get { return string.format("{0} {1}", pf.firstname, pf.lastname); }
}
因为它与 foreach 方法相同,并且在 datagridview 中使用该类时性能较差。
换句话说,我需要的是一个选择所有人及其全名的 linq 查询。
请注意,数据库选择后的任何分配(特别是与接口一起使用时)的性能都很差。
【问题讨论】:
-
你不能直接用
public string FullName { get { return string.format("{0} {1}",firstname, lastname); } }吗? -
不!因为 fullname 是一个示例,而我需要的是超过 5 个字段的连接,所以处理 FullName.get 将花费宝贵的时间。它将绑定到 datagridview
标签: c# linq lambda linq-to-sql