LINQ查询出错

时间:2015-04-27 17:07:32

标签: c# linq

我对此查询有疑问:

var res = from c in db.Client
          where db.TimesheetLine.Select(o => o.ClientId && 
                                             o.TimesheetId == timesheetId)
                                .Contains(c.Id)
          select c;

我收到错误消息:

  

运营商'&&'不能应用于'int?'类型的操作数和'布尔'。

我想做的就是选择时间表X中的所有客户

我有客户端类和时间表行

public class CLient 
{
    public int Id { get; set; }
    public string ClientName { get; set; }
}

public class TimesheetLine
{
    public int TimesheetLineId { get; set; }
    public int TimesheetId { get; set; }
    public System.DateTime Date { get; set; }
    public double Duration { get; set; }
    public Nullable<int> ClientId { get; set; }
    public Nullable<int> ClientAddressId { get; set; }
    public int ActivityTypeId { get; set; }
    public string Overtime { get; set; }
    public string Description { get; set; }

    public virtual Activity Activity { get; set; }
    public virtual Client Client { get; set; }
    public virtual ClientAddress ClientAddress { get; set; }
    public virtual Timesheet Timesheet { get; set; }
}

3 个答案:

答案 0 :(得分:3)

尝试使用其他查询:

var res = (from ts in db.TimesheetLine
           where ts.TimesheetId == timesheetId)
           select ts.Client).ToList();

遍历TimsheetLine数据,挑选与特定时间表相关联的客户。

您可以进行空检查以防万一:

var res = (from ts in db.TimesheetLine
           where ts.TimesheetId == timesheetId && ts.Client != null)
           select ts.Client).ToList();

答案 1 :(得分:3)

您可以制作join

var res = from client in db.Client
          join timesheetLine in db.TimesheetLine
          on client.Id equals timesheetLine.ClientId.GetValueOrDefault()
          where timesheetLine.timesheetId == timesheetId
          select client;

这里有趣的部分是我们希望将连接基于可空int,timesheetLine.ClientId和int client.Id的值。为了实现它,我们使用GetValueOrDefault方法返回默认值nullable,当nullable没有值时。在这种情况下,将返回的值为0. 假设没有任何客户端Id以上工作。不同的是,我们必须改变它。

答案 2 :(得分:1)

您无法在Select内编写条件语句。您可以改为使用Any

  var res = from c in db.Client
            where db.TimesheetLine.Any(o => o.ClientId == c.Id)
            select c;