C# 使用LINQ查询对象时出现WCF错误

C# 使用LINQ查询对象时出现WCF错误,c#,wcf,entity-framework-4,linq-to-entities,n-tier-architecture,C#,Wcf,Entity Framework 4,Linq To Entities,N Tier Architecture,请原谅,如果这是一个重复的问题-我已经搜索,但没有找到任何解释我的问题 我创建了一个ASP.NET网站。我有3层-数据访问、业务、演示。我在整个使用实体框架的过程中使用了共享实体 演示文稿:用户界面 业务:WCF服务 数据访问:连接到DB的代码(包含EF上下文、连接字符串) 实体:.edmx-EF实体。这三个层都是共享的 我在WCF服务中遇到了一些我无法理解的奇怪行为。我的原始代码在DAL中有一个函数,用于查询数据库中的所有客户,并返回一个列表。然后,服务根据UI请求进一步查询此列表,并将列

请原谅,如果这是一个重复的问题-我已经搜索,但没有找到任何解释我的问题

我创建了一个ASP.NET网站。我有3层-数据访问、业务、演示。我在整个使用实体框架的过程中使用了共享实体

  • 演示文稿:用户界面
  • 业务:WCF服务
  • 数据访问:连接到DB的代码(包含EF上下文、连接字符串)
  • 实体:.edmx-EF实体。这三个层都是共享的
我在WCF服务中遇到了一些我无法理解的奇怪行为。我的原始代码在DAL中有一个函数,用于查询数据库中的所有客户,并返回一个列表。然后,服务根据UI请求进一步查询此列表,并将列表返回到表示层

达尔:

public List GetCustomers()
{
List custList=新列表();
尝试
{
使用(NorthWindEntities上下文=新的NorthWindEntities(connectionString))
{
custList=context.Customers
.包括(“订单”)
.包括(“订单详情”)
.ToList();
}
返回客户名单;
}
捕获(例外情况除外)
{
//处理异常
返回客户名单;
}
} 
周转基金:

公共列表GetCustomerByState(字符串状态)
{
contextManager contextDAL=新建contextManager();
List custList=contextDAL.GetCustomers()
.其中(c=>c.State==State)
.ToList();
返回客户名单;
}
当我调试代码时,一切正常,但是当服务试图将custList返回给客户端时,我得到了这个错误:在接收对localhost/WCF/MyService的HTTP响应时出错。这可能是由于服务端点绑定未使用HTTP协议造成的。这也可能是由于服务器中止了HTTP请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志

我将我的DAL更改为包含整个查询和WCF服务:

  public List<customer> GetCustomersByState(string state)
    {
        contextManager contextDAL = new contextManager();
        List<Customer> custList = contextDAL.GetCustomers(state)
        return custList;
    }
公共列表GetCustomerByState(字符串状态)
{
contextManager contextDAL=新建contextManager();
List custList=contextDAL.GetCustomers(state)
返回客户名单;
}
这很有效。我还尝试将整个查询放在服务中(服务直接连接到上下文并获得列表),这也很好地工作

因此,基本上,我的问题是,为什么WCF服务不能返回使用Linq to Objects查询的objetcs列表(DAL返回客户列表,因此所有进一步的查询都是Linq to Objects)。使用LINQtoEntities(包含服务中的所有代码)可以很好地工作,而且根本不需要查询,只需要获取一个列表并返回它就可以了


很抱歉,我的帖子太长了,我试图包括所有必要的细节…谢谢

经过多次尝试和错误,我发现这不是一个查询问题,而是一个大小问题。虽然WCF服务过滤了我的数据,只返回了一些记录,但我猜它保留了对其余数据的某种引用,因为它错误地使用了太多的数据。如果我在DAL上进行部分筛选,然后继续在WCF层上进行筛选,得到的记录数量与我最初尝试返回的记录数量相同,那么它将毫无问题地返回列表


我无法解释为什么会发生这种情况,我对WCF了解不多,只是解释了我为避免其他人出现此问题而采取的措施。

您的DAL方法包括两个其他对象-当您最初的WCF调用从该集合中取出客户信息时,它也将数据放入相关对象中。这与WCF无关,顺便说一句(超出大小限制,可以调整)-根本原因是LINQ查询。这是有道理的。那么,我如何修复我的查询,使其以原来的方式工作呢?我需要与客户一起传递“Include”表。您必须增加绑定的大小限制。如果你发布你的配置文件(服务和客户端),我可以告诉你怎么做,如果你不知道怎么做的话。我做了,我对代码也做了一些修改,现在它可以工作了!谢谢你,蒂姆,解释了为什么会发生这种情况。@Dan Ling,在我回答后两天我才能接受它-所以
 public List<Customer> GetCustomersByState(string state)
    {
        contextManager contextDAL = new contextManager();
        List<Customer> custList = contextDAL.GetCustomers()
                                            .Where(c => c.State == state)
                                            .ToList();
        return custList;
    }
  public List<customer> GetCustomersByState(string state)
    {
        contextManager contextDAL = new contextManager();
        List<Customer> custList = contextDAL.GetCustomers(state)
        return custList;
    }