2017-03-17 139 views
0

我有一个在整个应用程序中多次使用的查询,我想做一个函数来简化它。作为扩展方法的Linq查询

我试图让它成为IQueryable,ICollection,没有任何工作。

这就是我想做的事,基本上是:

这是一个查询:

dias = db.T_AGENDA_AGENDAMENTOS 
     .Where(r => 
       (
        r.T_AGENDA_AGENDAMENTOS_CLIENTES_PARTICIPANTE.Count(
          x => new[] { 1, 2, 5, 6, 7 }.Contains(x.T_AGENDA_AGENDAMENTOS_CLIENTES_PARTICIPANTE_STATUS.COD_PARTICIPANTE_STATUS) && 
          x.T_CLIENTES.IND_ATIVO == "s" && 
          x.IND_ATIVO == "s") < ((r.IND_AVULSO == "s") ? 1 : r.T_AGENDA_AGENDAMENTOS_FIXOS.NUM_MAXIMO_PARTICIPANTES) 
       ) 
      ) 
    .Select(z => EntityFunctions.TruncateTime(z.DAT_INICIO)) 
    .Distinct().ToList(); 

r.T_AGENDA_AGENDAMENTOS_CLIENTES_PARTICIPANTE.Count(这一部分是一个多次使用:

x => new[] { 1, 2, 5, 6, 7 }.Contains(x.T_AGENDA_AGENDAMENTOS_CLIENTES_PARTICIPANTE_STATUS.COD_PARTICIPANTE_STATUS) && 
x.T_CLIENTES.IND_ATIVO == "s" && 
x.IND_ATIVO == "s" 

我想把它变成一个函数或者某个东西,这样我就不需要一直复制粘贴了。

这是我已经试过了,没有成功:

public static ICollection<T_AGENDA_AGENDAMENTOS_CLIENTES_PARTICIPANTE> Ativos(this ICollection<T_AGENDA_AGENDAMENTOS_CLIENTES_PARTICIPANTE> source, int codAgendamento) 
    { 
      return source    
      .Where(x => !(new[] { 3, 4, 9 } 
        .Contains(x.T_AGENDA_AGENDAMENTOS_CLIENTES_PARTICIPANTE_STATUS.COD_PARTICIPANTE_STATUS)) && 
        x.T_CLIENTES.IND_ATIVO == "s" && 
        x.IND_ATIVO == "s" && 
        x.COD_AGENDAMENTO == codAgendamento) 
      .ToList(); 
    } 

然后使用这样的功能:

dias = db.T_AGENDA_AGENDAMENTOS 
     .Where(r => 
       (
        r.T_AGENDA_AGENDAMENTOS_CLIENTES_PARTICIPANTE.Ativos(r.COD_AGENDAMENTO).Count() < ((r.IND_AVULSO == "s") ? 1 : r.T_AGENDA_AGENDAMENTOS_FIXOS.NUM_MAXIMO_PARTICIPANTES) 
       ) 
     ) 
     .Select(z => EntityFunctions.TruncateTime(z.DAT_INICIO)) 
     .Distinct().ToList(); 

这是我得到的错误:

错误CS1061'ICollection' 不包含'Ativos'的定义,也没有扩展方法 “Ativos”接受的类型 “ICollection的”第一个参数可以发现 (是否缺少using指令或程序集引用?)

可以做些什么?

+0

请在下次对齐您的代码 –

+0

您之所以会出现这种问题,是因为喜欢您的帖子,您的代码不容易阅读,如果您需要帮助,您应该花时间编写出色的帖子,所以人们可以很容易地理解它,没有人想浪费额外的时间来找出可以通过更好的沟通解决的事情 –

+0

现在来帮助你:1.为什么你在你不使用的扩展方法中创建一个Db上下文它。 2.你不能调用你的扩展方法,你要创建一个表达式来将它传递到我最初使用它的 –

回答

1

你可以你的lambda表达式存储在一个变量或属性:

Expression<Func<T_AGENDA_AGENDAMENTOS_CLIENTES_PARTICIPANTE, bool>> exp = x => new[] { 1, 2, 5, 6, 7 }.Contains(x.T_AGENDA_AGENDAMENTOS_CLIENTES_PARTICIPANTE_STATUS.COD_PARTICIPANTE_STATUS) && 
x.T_CLIENTES.IND_ATIVO == "s" && 
x.IND_ATIVO == "s" 

,然后用它在任何expersion:

dias = db.T_AGENDA_AGENDAMENTOS 
     .Where(
      r.T_AGENDA_AGENDAMENTOS_CLIENTES_PARTICIPANTE.Count(exp) < ((r.IND_AVULSO == "s") ? 1 : r.T_AGENDA_AGENDAMENTOS_FIXOS.NUM_MAXIMO_PARTICIPANTES) 
     ) 
     .Select(z => EntityFunctions.TruncateTime(z.DAT_INICIO)) 
     .Distinct().ToList(); 

这是你需要什么?这样你可以重用你的lambda表达式。您可以将其存储在静态只读属性中。

如果你需要一些参数,你可以使用的方法来代替:

Expression<Func<T_AGENDA_AGENDAMENTOS_CLIENTES_PARTICIPANTE, bool>> exp(int[] group){ 
    return x => group.Contains(x.T_AGENDA_AGENDAMENTOS_CLIENTES_PARTICIPANTE_STATUS.COD_PARTICIPANTE_STATUS) && 
    x.T_CLIENTES.IND_ATIVO == "s" && 
    x.IND_ATIVO == "s" 
} 

希望它能帮助!