使用Linq </int>定义查询参数类型List <int>内联时出错

时间:2013-12-18 17:32:57

标签: c# .net linq

我不确定这是不是一个错误,但是我遇到了错误而且我没有看到原因是什么。我有一个方法,接受一个带有查询参数的参数。

public static List<EmailNotification> GetEmailNotifications (EmailNotificationQuery query)
{
    using (HalDataContext hal = new HalDataContext())
    {
        IQueryable<EmailNotification> emailNotifications = hal.EmailNotifications;

        if (query.EmailNotificationID != null)
        {
            emailNotifications = emailNotifications.Where(en => en.EmailNotificationID == query.EmailNotificationID);
        }

        if (query.EmailNotificationIDs.Count > 0)
        {
            emailNotifications = emailNotifications.Where(en => en.EmailNotificationID.In(query.EmailNotificationIDs));
        }

        if (query.EmailNotificationTemplateID != null)
        {
            emailNotifications = emailNotifications.Where(en => en.EmailNotificationTemplateID == query.EmailNotificationTemplateID);
        }

        //this was causing error!!!!!!!!!!!!!!!!
        if (query.EmailNotificationTemplateIDs.Count > 0)
        {
            emailNotifications = emailNotifications.Where(en => en.EmailNotificationTemplateID.In(query.EmailNotificationTemplateIDs);
        }

        return emailNotifications.ToList();
    }
}

查询类

public class EmailNotificationQuery
{
    public EmailNotificationQuery ()
    {
        EmailNotificationIDs = new List<int>();
    }

    public List<int> EmailNotificationIDs { get; set; }
    public int? EmailNotificationID { get; set; }
    public int? EmailNotificationTemplateID { get; set; }
    public List<int> EmailNotificationTemplateIDs { get; set; }
}

当我调用类似下面的方法时,LINQ会出错。

emailNotifications = EmailNotification.GetEmailNotifications(
  new EmailNotificationQuery() { EmailNotificationTemplateIDs = new List<int> 
      {(int)HalTypes.EmailNotificationType.EmployeeAddedToTask, 
       (int)HalTypes.EmailNotificationType.EmployeeRemovedFromTask} }); 

如果我没有内联定义列表,那么查询将起作用,但是当它被内联定义时,它会引发以下错误:

  

方法'布尔在[Int32]中(Int32,   System.Collections.Generic.IEnumerable`1 [System.Int32])'没有   支持转换为SQL。

这是一个LINQ错误,还是我错过了什么?提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

错误消息为您提供所需的信息。

Method 'Boolean In[Int32](Int32, System.Collections.Generic.IEnumerable`1[System.Int32])' has no supported translation to SQL.

LINQ正在尝试创建一个SQL语句以匹配您提供的指令,但是在In方法上遇到了阻塞,我假设它是您在

上定义的扩展方法
Nullable<int>

尝试改为:

emailNotifications = emailNotifications.Where(en => query.EmailNotificationTemplateIDs.Contains(en.EmailNotificationTemplateID));

编辑:如果您还没有使用它,LinqPad是调试LINQ查询的好方法。根本不隶属于它,只是一个快乐的用户。