【问题标题】:How can I return variable column lengths via LINQ to SQL如何通过 LINQ to SQL 返回可变列长度
【发布时间】:2012-06-03 11:20:47
【问题描述】:

我在互联网上进行了搜索,但找不到与我所追求的直接匹配的任何内容....

我有一个存储过程,它返回一组固定的列(比如说 ColumnA、ColumnB 和 ColumnC),然后另外返回一个不确定数量/签名的附加列(可能是 ColumnD、ColumnE 和 ColumnF,或者 ColumnF、ColumnP、ColumnT和列 W)。

查询的动态部分由 proc 的 Id 参数确定。

不幸的是,我无法控制架构,而且它的设计很糟糕,以至于在末尾添加了大量不相关的列(并且他们不断添加它们),而不是有一个额外的表来存储这很有效。

因此,我无法在编译时返回一组确定的列,因此 LINQ to SQL 无法确定存储过程的返回类型。

我还有其他选择,或者可以解决这个问题的方法吗?这是我在下面做的一个例子。我可以重新编写它以使用 LINQ to SQL 吗?如果有帮助,我正在使用 C# 和 SQL Server 2008 编写应用程序。

谢谢。

CREATE PROCEDURE [Foo].[GetBar]
(
    @Id INT,
    @FooVar VARCHAR(50),
    @BarVar DATE
)

AS 
BEGIN

CREATE TABLE #TempTbl 
(     
    [ColumnName] VARCHAR(50)
)

INSERT #TempTbl EXEC [Foo].GetColumnNames @Id
DECLARE @ColumnNameList NVARCHAR(max) 
SET @ColumnNameList = '' 
SELECT @ColumnNameList = COALESCE(@ColumnNameList + '],[', '') + ColumnName FROM #TempTbl
DROP TABLE #TempTbl
SELECT @ColumnNameList = @ColumnNameList + ']'
SELECT @ColumnNameList = SUBSTRING(@ColumnNameList, 3, LEN(@ColumnNameList) )

DECLARE @FixedColumns VARCHAR(200)
DECLARE @SelectQuery NVARCHAR(max) 
DECLARE @WhereQuery VARCHAR (100)
DECLARE @FullQuery NVARCHAR(max) 
DECLARE @ParamaterDef nvarchar (100)
DECLARE @Foo VARCHAR(50)
DECLARE @Bar DATE

SET @FixedColumns = N'[ColumnA], [ColumnB], [ColumnC], '
SET @SelectQuery = N'SELECT ' + @FixedColumns + @ColumnNameList + N' FROM [Foo].[FooBar] '
SET @WhereQuery = N'WHERE [Foo] = @Foo AND [Bar] = @Bar'
SET @FullQuery = @SelectQuery + @WhereQuery   
SET @ParamaterDef = N'@Foo VARCHAR(50), @Bar DATE'

EXECUTE sp_executesql @FullQuery, @ParamaterDef, @Foo = @FooVar, @Bar = @BarVar 

END 

【问题讨论】:

    标签: c# .net sql linq tsql


    【解决方案1】:

    你能不能只使用填充DataSet 的SQL Data Adapter?然后你可以使用 LINQ 到 DataSet 并执行你所有的 LINQ 操作:

    DataTable yourDataTable = ds.Tables["TableName"];
    
    var query =
       from yourDataTable in yourDataTable.AsEnumerable()
       select new
       {
          NewField = yourDataTable.Field<int>("ColumnName"),
          NewField2 = yourDataTable.Field<string>("ColumnName2"),
       };
    

    MSDN (LINQ to DataSet)

    MSDN (Single table queries using LINQ to DataSet

    【讨论】:

    • 感谢您的建议,基于此,我现在已经开始工作了。
    猜你喜欢
    • 2012-07-30
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多