我正在尝试查询数据库并返回两个连接成一个字符串的列,是否有一种简单的方法可以执行此操作?
public ActionResult GetContactList (int? id)
{
var contacts = (from ofg in db.Contacts
where ((ofg.ContactId == id) && (ofg.Deleted == false))
select new
{
(ofg.FirstName + ofg.Surname as ofg.FullName),
ofg.ContactID
}).OrderBy(ofg => ofg.FirstName);
return this.Direct(contacts.ToArray());
}
答案 0 :(得分:2)
在这种情况下创建一个新的匿名对象可能看起来更像这样:
select new { FullName = ofg.FirstName + ofg.Surname, ContactID = ofg.ContactID }
请注意,这不会起作用:
OrderBy(ofg => ofg.FirstName)
因为对象中没有FirstName
字段。 (仅限FullName
和ContactID
。)如果您需要按该字段排序,则需要选择该字段:
select new { FirstName = ofg.FirstName, FullName = ofg.FirstName + ofg.Surname, ContactID = ofg.ContactID }
您可能还会在此逻辑中发现,您的FullName
字段不会在名称之间添加空格。如果你想要,你需要将它包含在逻辑中。
作为旁注,像FullName
字段这样的东西通常是实际模型而不是匿名对象的好例子。考虑这样的事情:
public class SomeModel
{
public string FirstName { get; set; }
public string Surname { get; set; }
public int ContactID { get; set; }
public string FullName
{
get
{
return string.Format("{0} {1}", FirstName, Surname);
}
}
}
这会将FullName
逻辑封装在它所属的对象上,您只需选择该对象的实例即可:
select new SomeModel { FirstName = ofg.FirstName, Surname = ofg.Surname, ContactID = ofg.ContactID }
这种消耗代码的方式不必复制创建模型的逻辑,模型本身包含它拥有的逻辑。然后,您可以继续从那里添加更多功能,集中到单个模型。
答案 1 :(得分:0)
尝试为对象中的属性添加名称,对于示例:
public ActionResult GetContactList (int? id) {
var contacts = from ofg in db.Contacts
where ((ofg.ContactId == id) && (ofg.Deleted == false))
order by ofg.FirstName
select new { FullName = (ofg.FirstName + ofg.Surname),
ContactID = ofg.ContactID };
return this.Direct(contacts.ToArray());
}