我正在使用MVC 4和实体框架,我正在从服务器检索电子邮件:
var data = db.Candidates.Where(c => ids.Contains(c.ID) && c.Email1 != null).Select(c => new { c.Email1, c.ID }).ToList();
我的第一个问题:如果它是null,LINQ是否允许我从Email1字段返回一个空字符串,类似于SQL coalesce? (我会从where子句中删除null测试。)
第二个问题:最容易使用的对象是什么(如果我想将c.Name与Email1一起取代,则替换“var data =”,然后在循环中使用它们?我应该只创建一个模型吗? 2个领域?
非常感谢您提出任何见解。
答案 0 :(得分:3)
我的第一个问题:如果它是null,LINQ是否允许我从Email1字段返回一个空字符串,类似于SQL coalesce? (我会从where子句中删除null测试。)
是的,有??
运算符与coalesce
类似。
new { Email1 = c.Email1 ?? "", c.ID } //String.Empty would be nicer, but i think it depends on EF version if you are allowed to use it.
对于你的第二个问题,如果这是你将要使用它们的唯一地方,那么匿名是非常好的。 如果你想在其他地方使用它,是的,只用两个属性创建一个对象......毕竟这是对象的目的。 (或者结构?)
答案 1 :(得分:0)
2a上。 C#中的Null Coalescence运算符是??
。
2B。这可能会或可能不会由您的Linq Provider转换为数据库查询。
这样做,
var data = db.Candidates
.Where(c => ids.Contains(c.ID))
.Select(c => new
{
Id = c.Id,
Email1 = c.Email1 ?? string.Empty,
Name = c.Name
});
foreach(var row in data)
{
var name = row.Name // etc...
}
如果您的Linq Provider不支持??
运算符,请输入.ToList()
并使用linq-to-objects执行此类转换,
var data = db.Candidates
.Where(c => ids.Contains(c.ID))
.ToList() // <-- from here is Linq-To-Objects
.Select(c => new
{
Id = c.Id,
Email1 = c.Email1 ?? string.Empty,
Name = c.Name
});