WCF 和 LINQ






2.86/5 (8投票s)
一个使用 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
表由以下字段组成:ID
、fName
、lName
、City
和 State
。所有匹配的行都由该方法作为 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 日:初始发布