繁体   English   中英

Linq查询作为扩展方法

[英]Linq query as extension method

我有一个在整个应用程序中多次使用的查询,并且我想创建一个函数来简化它。

我试图使其成为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'的定义,并且找不到找到接受类型为'ICollection'的第一个参数的扩展方法'Ativos'(您是否缺少using指令或程序集引用?)

该怎么办?

您可以将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"

然后在任何扩展中使用它:

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"
}

希望能帮助到你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM