如何将LINQ to SQL结果传输到外部dll?

时间:2009-10-08 11:27:58

标签: c# sql-server vb.net linq-to-sql

在LINQ之前我会让我的主应用程序将SQL查询的结果返回到dataSet中。然后我将数据集作为参数传输到外部dll。现在我将引入一个LINQ to SQL查询,该查询作为IQueryable(Of vClientTable)对象返回。我希望能够将该组vClientTable结果传输到我的外部dll,以便dll使用结果中包含的数据。

我可能做错了以及尝试做错都行,但是想就什么是最好的使用方法提出一些建议。

数据库查询

Public Shared Function getClientData(ByVal clientID As Int32) As IQueryable(Of vClientTable)
Try
    Dim r = From p In dbLINQ.vClientTable _
       Where p.ltClientID = clientID _
       Order By p.cdCode _
       Select p
    Return r
Catch ex As Exception
    Return Nothing
End Try
End Function

通过数据库查询检索数据的App Sub

Dim recordData As IQueryable(Of vClientTable) = getClientData(clientID)

调用外部DLL子

dataComplete = outputClientData(Now, recordData)

DLL sub

public static Boolean outputClientData(DateTime rptDate, IQueryable<vClientData> clientData)
    {
        //Do something with the data
        return true;
    }

显然在外部dll中它不知道什么是IQueryable(vClientData)对象,即使我在外部项目中为dll创建了一个dbml文件和datacontext,它包含了与DB表相同的类/查看它仍然说对象是不同的类型。

我应该如何处理这个问题?

由于

3 个答案:

答案 0 :(得分:1)

外部dll可以使用其中的实体引用程序集吗?然后你可以返回任何收集/设置/你的任何类型。这是最简单的使用。

但是,我会倾向于避免在API上暴露IQueryable<T>,因为很难保证对所有操作的完全支持,并且难以保证调用者不会破坏您的DAL(意外或故意);我会谨慎操作,返回已知的构造,例如List<T>T[]等。

如果您无法添加引用,则其他选项包括:

  • 序列化(这实际上是WCF传输此类对象的方式;只需在设计器表面启用serialziation,并使用DataContractSerializer;您需要在另一端使用匹配的数据协定,但它不会t 必须是同一类型)
  • 转移到DataTable这样的已知类型 - 有点像thisthis,虽然我不是真的是{{1}的粉丝}}
  • 将其公开为DataTable,并使用反射(ho-hum)

答案 1 :(得分:1)

我假设一旦你到达你的外部dll,你的IQueryable就会关闭它的上下文,所以就在那里你有问题。如果您尝试枚举结果集,则可能会出现异常,因为它很可能已经处理了上下文。仅供参考,上下文基本上是将IQueryable连接到数据库的东西。

关于返回什么,我建议首先返回IList,而不是IQueryable。您可以通过在IQueryable上调用.ToList()来实现此目的,然后您将拥有

IList<vClientData>

这至少应该让您开始学习如何使用LINQ。学习如何正确使用IQueryable构造将需要一些练习和学习,但是将结果集推送到IList或某种类型的数组应该会让你上路。

答案 2 :(得分:1)

我在这里的第一反应是将数据访问层抽象到它自己的程序集中,并为它提供应用程序和DLL引用。这将允许您在两者中引用vClientData类,因为它只是您需要共享的类。