1

我很好奇在使用 Linq to Entities 投影到新对象时是否有一种方法,将 .Where 扩展添加到初始 Linq 查询(延迟执行和一些动态 lambda 表达式的构建)以进一步过滤基于属性的查询的投影对象,但(这里是主要问题)只从数据库返回一个属性(比如一个 ID 字段)(生成的选择语句只有一个返回值)。

所以我想更改以下内容:

        employees = from e in context.Employee
                    select new EmployeeObject()
                    {
                            EmployeeId = e.EmployeeId,
                            EmployeeFirstName = e.FirstName,
                             EmployeeLastName = e.LastName
                    };

这样我就可以在 .Where 中附加带有 lambda 扩展名的员工,以进一步缩小搜索范围,但只返回 EmployeeId 并让生成的 SQL 反映这一点。

我仍在学习 Linq to Entities,所以如果我没有正确描述某些内容,请原谅我。

谢谢!

4

2 回答 2

1

你可以这样做:

var employeeIds = from e in context.Employee
                  select new {
                      EmployeeID = e.EmployeeId
                  };

它只会通过匿名类型返回您需要的一个属性。或者:

var employeeIds = context.Employee.Where(/*filters...*/).Select(e => e.EmployeeId);
// another alternative: 
var employeeIds = from e in context.Employee select e.EmployeeId;

那只会给你ID。

编辑
只要您不枚举查询,就不会执行查询。
所以如果你说

var query = context.Employee;

您有一个非常简单的查询,您可以根据需要使用附加子句进行装饰:

query = query.Where(e => e.LastName.StartsWith("S"));
query = query.Where(e => e.FirstName == "Blah");

所有这些添加都不会执行查询,因此只要您的 ObjectContext 有效,您就可以像这样优化您的查询。

完成添加子句后,您可以添加最终投影

var results = query.Select(e => e.EmployeeId);

只有这样你才应该在results某处枚举或使用它。当然,您只能在执行过滤添加投影,因为根据定义,投影只会删除 EmployeeId 以外的所有属性。

于 2012-05-02T13:28:16.823 回答
0

不确定我是否完全理解,但你不能这样做:

context.Employee.Where(x => x.FirstName = "Bob").Select(x => x.Id);
于 2012-05-02T13:28:52.663 回答