Asp.net mvc 使用存储库模式将Linq转换为SQL:对象不支持转换为SQL

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

我整个上午都在为此挠头,但仍然无法找出可能的原因

我有一个复合存储库对象,它引用了另外两个存储库。我试图在LINQ查询中实例化一个模型类型(请参阅第一个代码段)


公共类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(); }
}