我有一个在整个应用程序中多次使用的查询,我想创建一个简化它的函数。
我试图让它成为一个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 :(得分: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"
然后在任何表现中使用它:
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"
}
希望它有所帮助!