在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表相同的类/查看它仍然说对象是不同的类型。
我应该如何处理这个问题?
由于
答案 0 :(得分:1)
外部dll可以使用其中的实体引用程序集吗?然后你可以返回任何收集/设置/你的任何类型。这是最简单的使用。
但是,我会倾向于避免在API上暴露IQueryable<T>
,因为很难保证对所有操作的完全支持,并且难以保证调用者不会破坏您的DAL(意外或故意);我会谨慎操作,返回已知的构造,例如List<T>
,T[]
等。
如果您无法添加引用,则其他选项包括:
答案 1 :(得分:1)
我假设一旦你到达你的外部dll,你的IQueryable就会关闭它的上下文,所以就在那里你有问题。如果您尝试枚举结果集,则可能会出现异常,因为它很可能已经处理了上下文。仅供参考,上下文基本上是将IQueryable连接到数据库的东西。
关于返回什么,我建议首先返回IList,而不是IQueryable。您可以通过在IQueryable上调用.ToList()来实现此目的,然后您将拥有
IList<vClientData>
这至少应该让您开始学习如何使用LINQ。学习如何正确使用IQueryable构造将需要一些练习和学习,但是将结果集推送到IList或某种类型的数组应该会让你上路。
答案 2 :(得分:1)
我在这里的第一反应是将数据访问层抽象到它自己的程序集中,并为它提供应用程序和DLL引用。这将允许您在两者中引用vClientData类,因为它只是您需要共享的类。