如何为从数据库获取的实体赋值

时间:2015-04-14 20:23:22

标签: asp.net linq entity-framework

我有一个如下所示的linq查询:

public IQueryable<vmEmp> GetEmp(int crewid)
    {
        var dt = new EmpEntities();
        var e = from t in dt.tblEmp
                where (t.CrewId == crewid)
                select new vmEmp
                {
                    Id = -1,
                    Crew = t.crewid,
                    Name = t.Name,
                    Address = t.Address
                };
        return e;
        }

我希望可以让Id自动减少1到员工结束。 比如第一个Id是-1,第二个是-2,第三个是-3 ......

这里怎么做?非常感谢

2 个答案:

答案 0 :(得分:2)

如果这是LINQ到对象,您可以使用this overload of Select

var dt = new EmpEntities();
var e = dt.tblEmp
        .Where(t => t.CrewId == crewid)
        .Select((t,index) => new vmEmp
        {
            Id = -index - 1,
            Crew = t.crewid,
            Name = t.Name,
            Address = t.Address
        });

但EF并没有支持这一点,因为索引器无法转换为SQL。所以你需要一个解决方法:

var dt = new EmpEntities();
var e = dt.tblEmp
        .Where(t => t.CrewId == crewid)
        .Select(t => new 
        {
            Id = 0,
            Crew = t.crewid,
            Name = t.Name,
            Address = t.Address
        }
        .AsEnumerable() // Continue in memory
        .Select((t,index) => new vmEmp
        {
            Id = -index - 1,
            Crew = t.Crew,
            Name = t.Name,
            Address = t.Address
        });

附注:建议将dt放入using构造中。

答案 1 :(得分:0)

使用计数器变量,并在将其投影到自定义POCO时为每个记录减少它。

public IQueryable<vmEmp> GetEmp(int crewid)
{
    int counter=0;
    var dt = new EmpEntities();

    //load the items to a list of anonymous type
    var eList = from t in dt.tblEmp
            where (t.CrewId == crewid)
            .Select(s=>
              new  { Id = 0,
                     Crew = s.crewid,
                     Name = s.Name,
                     Address = s.Address
                  }).ToList();

    var e=eList.Select(x=> new vmEmp
            {
                Id = --counter,
                Crew = x.Crew,
                Name = x.Name,
                Address = x.Address
            });
    return e.AsQueryable();
 }