Asp.net mvc 使用存储库模式将Linq转换为SQL:对象不支持转换为SQL
我整个上午都在为此挠头,但仍然无法找出可能的原因 我有一个复合存储库对象,它引用了另外两个存储库。我试图在LINQ查询中实例化一个模型类型(请参阅第一个代码段)Asp.net mvc 使用存储库模式将Linq转换为SQL:对象不支持转换为SQL,asp.net-mvc,linq-to-sql,asp.net-mvc-2,repository-pattern,Asp.net Mvc,Linq To Sql,Asp.net Mvc 2,Repository Pattern,我整个上午都在为此挠头,但仍然无法找出可能的原因 我有一个复合存储库对象,它引用了另外两个存储库。我试图在LINQ查询中实例化一个模型类型(请参阅第一个代码段) 公共类SqlCommunityRepository:ICommunityRepository { 上面代码段的最后一行是它失败的地方,它从不进入任何其他存储库方法。我在这三个对象后面的基础表之间没有关系。这是否就是LINQ to SQL无法正确构建表达式树的原因?尝试添加另一个类似以下内容的存储库方法: public int Comm
公共类SqlCommunityRepository:ICommunityRepository
{
上面代码段的最后一行是它失败的地方,它从不进入任何其他存储库方法。我在这三个对象后面的基础表之间没有关系。这是否就是LINQ to SQL无法正确构建表达式树的原因?尝试添加另一个类似以下内容的存储库方法:
public int CommunitiesCount()
{
get { return _ctx.Communities.Count(); }
}
这将允许您在不向用户公开整个对象树的情况下返回计数,我认为您无论如何都在尝试这样做
正如您可能已经猜到的,我怀疑您所称的匿名类型是错误的(它们不是真正的匿名类型;它们是实际的对象,您显然部分填充它们是为了向最终用户隐藏某些字段)。这些是非水合查询,而不是完全水合的集合
Communities查询与其他两个查询不同,因为它在对象水合时调用方法。这些方法调用不可转换为SQL
通常这不是问题。例如:如果您说Communities.ToList(),它将起作用,并在对象水合时从对象调用方法
如果修改查询,使对象不含水,例如:当您说Communities.Count()时,linq to sql会尝试将方法调用发送到数据库并抛出,因为它不能。即使这些方法调用最终不会影响结果计数,它也会这样做
最简单的修复方法(如果您确实希望完全水合的集合)是将ToList
添加到社区查询中,对其进行水合处理。我不确定Count()方法本身是否是罪魁祸首。当我执行cr.Communities时,我希望得到完全水合的IQueryable集合。mr.Markets.Count()和sr.States.Count()返回预期结果。是,_ctx.Communities.Count()给出了正确的计数。但是,我正在寻找communityRepository.Communities,一个IQueryable列表。就是这样。在您调用IQueryable上的方法之前,它不会启动查询?大多数Linq方法都是延迟的-它们在枚举结果之前不会计算查询。foreach和ToList都是枚举查询的方法。
public IQueryable<Model.State> States
{
get
{
return from state in _ctx.States
select new Model.State()
{
StateId = state.StateId,
StateName = state.StateName
};
}
}
public Model.State GetState(string stateName)
{
var s = (from state in States
where state.StateName.ToLower() == stateName
select state).FirstOrDefault();
return new Model.State()
{
StateId = s.StateId,
StateName = s.StateName
};
}
public SqlMarketRepository(WebDataContext ctx)
{
_ctx = ctx;
}
public IQueryable<Model.Market> Markets
{
get
{
return from market in _ctx.Markets
select new Model.Market()
{
MarketId = market.MarketId,
MarketName = market.MarketName,
StateId = market.StateId
};
}
}
public Model.Market GetMarket(int marketId)
{
return (from market in Markets
where market.MarketId == marketId
select market).FirstOrDefault();
}
}
WebDataContext ctx = new WebDataContext();
IMarketRepository mr = new SqlMarketRepository(ctx);
IStateRepository sr = new SqlStateRepository(ctx);
ICommunityRepository cr = new SqlCommunityRepository(ctx, sr, mr);
int commCount = cr.Communities.Count();
public int CommunitiesCount()
{
get { return _ctx.Communities.Count(); }
}