为什么我不能使用include?

时间:2015-03-10 20:56:03

标签: c# .net linq lambda linq-to-entities

那是我的代码:

ProjetoTipoCargaModelo projAux =
    dbContext.ProjetoTipoCargaDbSet.Find(idProjetoTipoCarga);
ICollection<ProjetoTipoCargaRegraModelo> regras =
    projAux.ListaRegra.Where(x => x.Ativo).ToList();
IQueryable<ProjetoTipoCargaRegraModelo> pr =
    dbContext.ProjetoTipoCargaDbSet.Select(
        x => regras.FirstOrDefault(y => y.IdProjetoTipoCarga == x.IdProjetoTipoCarga));

var projetoCompleto = pr.
    Include(x => x.ListaRegraLiberacaoInicioViagem).
    Include(x => x.ListaRegraTecnologiaAceita).
    Include(x => x.RegraAreaSombra).
    Include(x => x.RegraAtuadorNecessario)

它首先显示错误,但我尝试在Iquerable对象上执行此操作!

在哪里错了?

我的问题是将其包含在过滤的结果集中。

[编辑] 错误:

无法将lambda表达式转换为&#39; string&#39;因为它不是委托类型

它不是运行时错误,而是编译错误。

[编辑2] 我的用法:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;

[编辑3] 回答:

ICollection<ProjetoTipoCargaRegraModelo> regras = projAux.ListaRegra.Where(x => x.Ativo).ToList();
IQueryable<ProjetoTipoCargaModelo> pr = dbContext.ProjetoTipoCargaDbSet.Where(x => x.IdProjetoTipoCarga == regras.FirstOrDefault(y => y.IdProjetoTipoCarga == x.IdProjetoTipoCarga).IdProjetoTipoCarga);

var projetoCompleto = pr.
    Include(x => x.ListaRegraLiberacaoInicioViagem).
    Include(x => x.ListaRegraTecnologiaAceita).
    Include(x => x.RegraAreaSombra).

2 个答案:

答案 0 :(得分:0)

它与Include s无关。

您无法在LINQ到实体查询中使用regas,因为它是ICollection。 EF无法将其转换为SQL。

你的答案&#34;不能与EF合作。对象regasRegra个实体的内存列表(我猜)。如果你直接在...中使用它

var pr = dbContext.ProjetoTipoCargaDbSet
        .Where(x => x.IdProjetoTipoCarga == regras.FirstOrDefault(y => y.IdProjetoTipoCarga == x.IdProjetoTipoCarga).IdProjetoTipoCarga);

...你应该得到像

这样的例外
  

无法创建类型&#39; Regra&#39;的常量值。仅支持原始类型或枚举类型...

但是,男孩,这是一种曲折的方式来达到你想要的地方!首先,您通过ProjetoTipoCargaModelo获得idProjetoTipoCarga个对象。然后你获取它的活跃Regra。然后,您基本上使用IdProjetoTipoCarga的{​​{1}}值来查看其中一个是否等于原始Regra,如果是,则使用其值来获取idProjetoTipoCarga对象。

如果删除所有裁员,剩下的就是:

ProjetoTipoCargaModelo

我告诉你这个LINQ声明,你将你的包含附加到var pr = dbContext.ProjetoTipoCargaDbSet .Where(x => x.IdProjetoTipoCarga == idProjetoTipoCarga && x.ListaRegra.Any(r => r.Ativo));

答案 1 :(得分:-1)

.Include()方法仅适用于ObjectQuery<TEntity>

尝试:

context.EntitySet.Include(...).Select(...)

而不是:

context.EntitySet.Select(...).Include(...)

或使用这样的扩展方法:

public static class MyExtensions
{
    public static IQueryable<TEntity> Include<TEntity>(
        this IQueryable<TEntity> query, string path)
    {
        var efQuery = query as ObjectQuery<TEntity>;
        if (efQuery == null)
            return query;

        return efQuery.Include(path);
    }
}

或者更好的是,使用支持lambda表达式而不是字符串作为路径的已经可用的扩展方法

此外,除非大多数是1:1或:1关系,1:(或)关系大大增加数据库中的IO,否则不要使用这么多包含,导致表现不佳。

考虑使用.Future()的多个查询来改为对数据库进行单一访问。