11节-复杂类型和枚举

一些常用的字段属性,可以提取出来作为一个类,然后在其他实体中作为一个属性。比如我们的个人地址,通常包括街区、城市、省份、邮编等,那么我们可以将这些东西抽取出来作为一个类:

[ComplexType]
public class Address
{
public string Street { get; set; }
public string City { get; set; }
public string Province { get; set; }
public string Zip { get; set; }
}

有了上面的这个类,我们就可以在其他地方应用了,比如公司地址、住宅地址:

public class Company
{
public Company()
{
Address = new Address();
}
public int CompanyId { get; set; }
public string CompanyName { get; set; }
public Address Address { get; set; }
}

枚举在EF中也用到,比如一个会员账号的状态,有激活、未激活、未知三种状态,那么我们就可以定义成一个枚举类型:

public enum AccountState
{
Active,
Inactive,
Unknown
}

然后在会员类中我们就可以使用该枚举:

public class Account
{
public AccountState AccountState { get; set; }
}

在查找条件中,我们也可以直接引用:

var a = context.Account.Where(p => p.AccountState == AccountState.Inactive);

Select的使用,可以挑选一些属性出来的:

public AccountController()
{
var people = context.People
.Where(p => p.PersonState == PersonState.Active)
.OrderBy(p => p.LastName)
.ThenBy(p => p.FirstName)
.Select(p => new
{
p.LastName,
p.FirstName,
p.PersonType.TypeName
});
foreach (var person in people)
{
Console.WriteLine("{0} {1} {2}",
person.FirstName, person.LastName, person.TypeName);
}
}

一些其他的方法:

  • Count:计算记录的数量
  • Sum:计算列的和
  • Min:计算最小值
  • Max:计算最大值
  • Average:计算平均值

例如:

//获取生日最小的
var min = context.People.Min(p => p.BirthDate);

//统计激活状态的会员人数
var count = context.People.Count(p => p.PersonState == PersonState.Active);

//还可以统计导航属性的个数,例如计算每个账号的手机数量
var people = context.People
.Select(p => new
{
p.LastName,
p.FirstName,
p.Phones.Count
});

//计算升高的总和
var sum = query.Sum(p => p.HeightInFeet);

分页查找:

var people = context.People
.OrderBy(p => p.LastName)
.Skip((criteria.PageNumber - 1) * criteria.PageSize)
.Take(criteria.PageSize);

日期比较:

csharpcsharpm => m.IP == ip && System.Data.Entity.DbFunctions.DiffDays(m.AddTime, DateTime.Now) == 0

Join的使用。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注