65.9K
CodeProject 正在变化。 阅读更多。
Home

WCF 和 LINQ

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.86/5 (8投票s)

2008年7月22日

CPOL

3分钟阅读

viewsIcon

38313

一个使用 LINQ 查询数据库表并返回结果集合的 WCF Web 服务

引言

在本文中,我们将创建一个具有 HTTP 绑定的 Web 服务,该服务公开一个使用 LINQ 查询数据库表的方法。该方法在 WCF 服务的服务契约中定义。LINQ 查询的每个结果记录都填充到 WCF 服务的数据契约中定义的对象中。然后,该对象集合由服务方法作为泛型 IEnumerable 集合返回。

定义 WCF 服务

我们首先在 Visual Studio 2008 和 .NET 3.5 版本中使用 wsHttp 绑定创建 WCF 服务。该服务在 web.config 文件中定义,如下所示:

<services>
   <service name="SomeService" behaviorConfiguration="ServiceBehavior">
       <endpoint address=""  binding="wsHttpBinding" contract="ISomeService">
          ...

请注意,端点的地址属性暂时留空,以便 IIS 使用默认地址。这可以在部署时更改为固定地址。

然后,我们在 ISomeService.cs 文件中定义服务契约。服务契约是定义所有服务方法的地方。

[ServiceContract]
public interface ISomeService
{
   [OperationContract]
   string GetData(int value);

   [OperationContract]
   IEnumerable<EmpRecord> GetEmpData(string empLastName);
}

我们定义了两个方法,第一个方法只是一个简单的方法,它根据传入的 int 参数返回一个 string。第二个方法是我们真正感兴趣的方法,它接受员工的姓氏并返回 EmpRecord 对象集合。EmpRecord 类在服务的数据契约中定义,也在 ISomeService.cs 文件中,如下所示:

[DataContract]
public class EmpRecord
{
   int id = 0;
   string fName = "";
   string lName = "";
   string state = "";
   
  [DataMember]
  public int Id
  {
     get { return id; }
     set { id = value; }
  }
 
  [DataMember]
  public string First
  {
     get { return fName; }
     set { fName = value; }
  }
  
  [DataMember]
  public string Last
  {
     get { return lName; }
     set { lName = value; }
  }
  
  [DataMember]
  public string State
  {
     get { return state; }
     set { state = value; }
  }
}

EmpRecord 类在 WCF 服务中定义为数据契约,具有四个 private 字段和四个相应的 public 属性来获取和设置字段值。

在 WCF 项目的 SomeService.cs 文件中,我们实现上面定义的服务接口和方法,如下所示:

public class SomeService : ISomeService
{
   public string GetData(int value)
   {
       return string.Format("You entered: {0}", value);
   } 
   
   public IEnumerable<EmpRecord> GetEmpData(string empLastName)
   {
       LinqDataClassesDataContext ctxt = new LinqDataClassesDataContext();
       
       return from r in ctxt.Employees
              where r.lName.Contains(empLastName)
              select new EmpRecord 
		{ Id = r.ID, First = r.fName, Last = r.lName, State = r.state};
    }
}

LINQ 表达式用于 GetEmpData 方法的主体中,以查询 Employee 表,返回所有 lName 字段包含作为参数传入的姓氏字符串的行。Employee 表由以下字段组成:IDfNamelNameCityState。所有匹配的行都由该方法作为 IEnumerable 集合返回。LinqDataClassesDataContext 在 WCF 服务项目的 DBML 文件中定义,它基本上是一个 LINQ to SQL 数据上下文对象。我们通过将数据库表以可视方式拖放到添加到 WCF 项目的 LINQ to SQL DBML 文件中来创建此数据上下文对象。

消费 WCF 服务

为了使用 WCF 服务,我们创建一个 ASP.NET Web 应用程序项目,并在解决方案资源管理器中向其添加服务引用。然后,我们创建服务实例并调用适当的方法,例如:

protected void Page_Load(object sender, EventArgs e)
{
   SomeSvc.SomeServiceClient someSrvc = new SomeSvc.SomeServiceClient();
   var coll = someSrvc.GetEmpData("Evans");

   GridView2.DataSource = coll;
   GridView2.DataBind();
}

SomeSvc 是我添加到 ASP.NET Web 应用程序项目的服务引用的名称,它使我们可以访问客户端代理类。然后,我调用 GetEmpData 方法,传入员工的姓氏,并将返回的匹配 EmpRecord 对象集合绑定到 GridView。

或者,我们可以像下面这样迭代 EmpRecord 对象集合:

bool bFound = false;
foreach (SamSvc.EmpRecord empl in coll)
{
    if (empl.State.IndexOf("FL") >= 0)
    {
        bFound = true;
        break;
    }
}

关注点

  • 在 WCF 服务中将我们自己的对象定义为数据契约,并利用易于使用的 LINQ 表达式将返回的数据库记录封装在这些对象中的简易性。
  • 同样,服务契约使得在 WCF 服务中定义我们自己的方法,接受和返回我们自己定义的对象相当简单。

历史

  • 2008 年 7 月 22 日:初始发布
© . All rights reserved.