关于下面的两个类,我经常编写如下的LINQ语句...
如果有人能提供一个基本的例子,那就太好了,因为我对表达式树除了创建它们之外没有太多经验。
谢谢。
更新->像下面这样的东西是否可行?
using (var db = new DBContext())
{
var result = db.Countries
.Select(c => new
{
c.Name,
c.Leader != null ? c.Leader.Title : String.Empty,
c.Leader != null ? c.Leader.Firstname : String.Empty,
c.Leader != null ? c.Leader.Lastname : String.Empty
});
}
public class Country
{
public int Id { get; set; }
public string Name { get; set; }
public Leader Leader { get; set; }
}
public class Leader
{
public string Title { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
}
我遇到的问题是不断重复检查子导航属性的空值,并想知道是否有一种方式可以使用某种表达式树动态提取属性值,同时检查空值,并在它们不存在时返回空字符串,类似下面的方法..
public class Country
{
// Properties //
public string SafeGet(Expression<Func<Country, string>> fnc)
{
// Unpack fnc and check for null on each property?????
}
}
用法:
using (var db = new DBContext())
{
var result = db.Countries
.Select(c => new
{
c.Name,
c.SafeGet(l => l.Leader.Title),
c.SafeGet(l => l.Leader.Firstname),
c.SafeGet(l => l.Leader.Lastname)
});
}
如果有人能提供一个基本的例子,那就太好了,因为我对表达式树除了创建它们之外没有太多经验。
谢谢。
更新->像下面这样的东西是否可行?
public string GetSafe(Expression<Func<Country, string>> fnc)
{
var result = fnc.Compile().Invoke(this);
return result ?? string.Empty;
}
var defaultLeader = new Leader { Title = "", Firstname = "" }
,然后使用空合并运算符(c.Leader ?? defaultLeader).Title
来实现更简洁的内容。额外的奖励:对于所有其他属性类型也适用。 - Jon