Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将LINQ to SQL结果传输到外部dll?_C#_Sql Server_Vb.net_Linq To Sql - Fatal编程技术网

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

C# 如何将LINQ to SQL结果传输到外部dll?,c#,sql-server,vb.net,linq-to-sql,C#,Sql Server,Vb.net,Linq To Sql,在LINQ之前,我会让我的主应用程序将SQL查询的结果返回到数据集中。然后,我将数据集作为参数传输到外部dll。现在,我将实现一个LINQtoSQL查询,该查询作为IQueryable(vClientTable的)对象返回。我希望能够将这组vClientTable结果传输到我的外部dll,以便dll能够处理结果中包含的数据 我可能做的都是错的,也可能试图做的都是错的,但是我想听听关于什么是最好的使用方法的建议 数据库查询 Public Shared Function getClientData(

在LINQ之前,我会让我的主应用程序将SQL查询的结果返回到数据集中。然后,我将数据集作为参数传输到外部dll。现在,我将实现一个LINQtoSQL查询,该查询作为IQueryable(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
通过DB查询检索数据的App Sub

Dim recordData As IQueryable(Of vClientTable) = getClientData(clientID)
调用外部DLL子对象

dataComplete = outputClientData(Now, recordData)
动态链接库子

public static Boolean outputClientData(DateTime rptDate, IQueryable<vClientData> clientData)
    {
        //Do something with the data
        return true;
    }
public静态布尔outputClientData(DateTime rptDate,IQueryable clientData)
{
//对数据做点什么
返回true;
}
显然,在外部dll中,它不知道IQueryable(vClientData)对象是什么,即使我在外部项目中为dll创建了一个dbml文件和datacontext,其中包含DB表/视图的相同类,它仍然表示对象是不同的类型

你知道我该怎么做吗


谢谢

外部dll是否可以引用包含实体的程序集?然后可以返回任何集合/集合/任何类型。这是最简单的用法

然而,我倾向于避免在API上公开
IQueryable
,因为很难保证对所有操作的完全支持,也很难保证调用方不会(意外或故意)破坏DAL;我将使用谨慎的操作返回已知的结构,例如
List
T[]
,等等

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

  • 序列化(这本质上是WCF传输此类对象的方式;只需在设计器表面上启用序列化,并使用
    DataContractSerializer
    ;另一端需要匹配的数据协定,但它不必是相同的类型)
  • 转换为一种已知类型,例如
    DataTable
    ——有点像and,尽管我不是
    DataTable
  • 将其显示为
    对象
    ,并使用反射(ho-hum)

我假设,一旦您访问外部dll,IQueryable的上下文就会被关闭,所以您就有问题了。如果您试图枚举整个结果集,您可能会得到一个异常,因为上下文很可能已经被释放。仅供参考,上下文基本上就是将IQueryable连接到数据库的东西

至于返回什么,我建议首先返回IList,而不是IQueryable。您可以通过在IQueryable上调用.ToList()来完成此操作,然后您将有一个

IList


这至少可以让你开始学习如何与LINQ相处。学习如何正确使用IQueryable结构需要一些实践和学习,但是,将结果集推送到IList或某种数组应该会让您上路。

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

Marc,外部dll实际上是一个dll/类,在我的解决方案中有一个单独的项目,仅用于将数据导出为Excel格式。我完全可以控制“外部”dll的工作方式。我只使用IQueryable,因为这似乎返回了最好的结果,并且在应用程序中相对容易使用。我在其他领域使用DataTable,但只有当我有少量列时才使用。在这个特定的示例中,我将返回30-40列和多行。构建数据表似乎是一种很麻烦的方法,尽管这是我的第一个想法。但是后来我想我会把quessie扔出去看看是否有更好的方法。Joseph,确切地说,外部dll不知道上下文,即使我创建了它自己的上下文,它似乎认为它们无论如何都是不同的。我将尝试使IList类型工作。虽然我的数据是多行、多列的,但这会导致IList出现任何问题吗?@Travis您应该看到的是,一旦通过结果集枚举,就会填充vClientTable实例的列表。例如,由于您只查找ltClientID=clientID的实例,因此假设表中有4条记录符合该条件。列表中有4个vClientTable对象实例。如果您只需要该查询中的一条记录,我会将其从返回IList改为使用First或FirstOrDefault,这将只返回查询得到的第一个vClientTable对象。@Joseph,肯定需要多条记录。听起来是个好主意,但我太新手了,无法实现这一点。我当然会看看我是否能弄清楚它是如何工作的,谢谢。看看网络上关于存储库模式的信息,这会让你很好地了解你在寻找什么样的东西。我敢肯定,C#中有一些例子。