Linq语法-选择多个列


97

这是我在实体模型中使用的Linq语法

IQueryable<string> objEmployee = null;

objEmployee = from res in _db.EMPLOYEEs
              where (res.EMAIL == givenInfo || res.USER_NAME == givenInfo)
              select res.EMAIL;

如何选择多列?就像我想选择res.ID一样。我怎么能收到这些呢?我认为IQueryable无法正常工作。这就是所谓的Linq to SQL,对吗?


3
LinqToSql和实体框架是不同的。见stackoverflow.com/questions/8676/...
吉迪恩

Answers:


190

如其他答案所示,您需要使用匿名类型。

就语法而言,我个人更喜欢方法链接。方法链等效为:-

var employee = _db.EMPLOYEEs
    .Where(x => x.EMAIL == givenInfo || x.USER_NAME == givenInfo)
    .Select(x => new { x.EMAIL, x.ID });

在AFAIK中,声明性LINQ语法在编译时会转换为与此类似的方法调用链。

更新

如果您需要整个对象,则只需省略对的调用Select(),即

var employee = _db.EMPLOYEEs
    .Where(x => x.EMAIL == givenInfo || x.USER_NAME == givenInfo);

72

您可以使用匿名类型,例如:

  var empData = from res in _db.EMPLOYEEs
                where res.EMAIL == givenInfo || res.USER_NAME == givenInfo
                select new { res.EMAIL, res.USER_NAME };

您能否建议如何正确编写此表达式:选择新的{(DateTime.Now-债务.ClaimDate),债务。金额};?它引发错误:无效的匿名类型成员声明

1
@DainiusKreivys select new { Diff = (DateTime.Now - debt.ClaimDate), Amount = debt.Amount}。答案中使用的形式是一种简写形式,其中初始化表达式中的成员名称用作匿名类型的字段名称。例如new {res.EMAIL, res.USER_NAME}是的简写new {EMAIL = res.EMAIL, USER_NAME = res.USER_NAME}。如果有一个表达式(如您的日期),则速记不适用于编译器错误。
伊万·丹尼洛夫

5
 var employee =  (from res in _db.EMPLOYEEs
 where (res.EMAIL == givenInfo || res.USER_NAME == givenInfo)
 select new {res.EMAIL, res.USERNAME} );

或者你可以使用

 var employee =  (from res in _db.EMPLOYEEs
 where (res.EMAIL == givenInfo || res.USER_NAME == givenInfo)
 select new {email=res.EMAIL, username=res.USERNAME} );

说明:

  1. 从数据库中选择雇员作为res。

  2. 根据where条件过滤员工详细信息。

  3. 通过使用新的{}创建一个匿名对象,从雇员对象中选择必填字段


在答案中添加解释。
桑迪普

您如何访问不同的列?
ARidder101 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.