那是我的代码:
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).
答案 0 :(得分:0)
它与Include
s无关。
您无法在LINQ到实体查询中使用regas
,因为它是ICollection
。 EF无法将其转换为SQL。
你的答案&#34;不能与EF合作。对象regas
是Regra
个实体的内存列表(我猜)。如果你直接在...中使用它
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()的多个查询来改为对数据库进行单一访问。