在实体框架中获取特定列

时间:2011-11-28 10:51:56

标签: c# asp.net entity-framework generics

我想从数据库中获取用户列表,但我只想要5列而不是所有列(它有大约35列)。当我写下面的内容时,它在编译时显示没有错误,但在运行时显示错误。

bksb_Users是我的数据库中的表名以及实体模型中的对象名。

public List<bksb_Users> SearchStudents(string reference, string firstname, string lastname)
        {
            return (from u in context.bksb_Users
                    where u.userName.Contains(reference)
                    && u.FirstName.Contains(firstname)
                    && u.LastName.Contains(lastname)
                    orderby u.FirstName, u.LastName
                    select new bksb_Users
                     {
                         user_id = u.user_id,
                         userName = u.userName,
                         FirstName = u.FirstName,
                         LastName = u.LastName,
                         DOB = u.DOB
                     }).Take(100).ToList<bksb_Users>();
        }

错误是......

The entity or complex type 'bksbModel.bksb_Users' cannot be constructed in a LINQ to Entities query.

2 个答案:

答案 0 :(得分:3)

以下工作吗?

public List<bksb_Users> SearchStudents(string reference, string firstname, string lastname) 
    { 
        var anon = (from u in context.bksb_Users 
                where u.userName.Contains(reference) 
                && u.FirstName.Contains(firstname) 
                && u.LastName.Contains(lastname) 
                orderby u.FirstName, u.LastName 
                select new 
                 { 
                     user_id = u.user_id, 
                     userName = u.userName, 
                     FirstName = u.FirstName, 
                     LastName = u.LastName, 
                     DOB = u.DOB 
                 }).Take(100).ToList(); 

        return anon.Select(z => new bksb_Users()
        {
            user_id = z.user_id, userName = z.userName, FirstName = z.FirstName, DOB = z.DOB
        }).ToList();
    } 

我所做的就是将任务分成两个步骤:

  1. 使用LINQ to Entities获取数据(进入匿名类型)。
  2. 使用LINQ to将匿名类型转换为所需类型 对象。
  3. 注意一个更好的选择是创建一个只包含你需要的字段/属性的新类型(类) - 这将消除对第2步的需要,并且会使你的函数的调用者清楚哪些列是'人口稠密',哪些不是。这也意味着您不太可能“意外”尝试将这些半填充的实体保留回数据库。

答案 1 :(得分:0)

由于某种原因,我猜那个字段DOB看起来像这样

public object DOB { get { return fieldX + fieldY } }

实体框架不明白。查询中的所有字段都必须与DB

中的某些列进行映射