2012-05-29 25 views
5

Tôi đã tìm kiếm trên internet và không thể tìm thấy bất kỳ thứ gì khớp trực tiếp với những gì tôi đang theo dõi.Làm thế nào tôi có thể trả về độ dài cột biến thông qua LINQ to SQL

Tôi có một thủ tục được lưu trữ một tập hợp các cột cố định (giả sử ColumnA, ColumnB và ColumnC) và sau đó trả về một số không xác định/chữ ký của các cột bổ sung (có thể là ColumnD, ColumnE và ColumnF, hoặc ColumnF, ColumnP, ColumnT và ColumnW).

Phần động của truy vấn được xác định bởi thông số Id cho proc.

Thật không may là tôi không kiểm soát được lược đồ và nó đã được thiết kế kém để có một số lượng lớn các cột không liên quan được thêm vào cuối (và họ tiếp tục thêm chúng), thay vì có thêm (các) bảng lưu trữ hiệu quả.

Kết quả là, tôi không thể trả về một tập hợp các cột xác định tại thời gian biên dịch, vì vậy LINQ to SQL không thể xác định kiểu trả về của thủ tục được lưu trữ.

Tôi có bất kỳ tùy chọn nào khác hoặc cách tôi có thể giải quyết vấn đề này không? Đây là một ví dụ về những gì tôi đang làm bên dưới. Tôi có thể viết lại để làm việc với LINQ to SQL không? Tôi đang viết các ứng dụng với C# và SQL Server 2008 nếu điều đó giúp.

Cảm ơn.

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 

Trả lời

6

Bạn không chỉ sử dụng số SQL Data Adapter có điền DataSet? Sau đó bạn có thể sử dụng LINQ to DataSet và thực hiện tất cả các hoạt động của bạn 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

+1

Cảm ơn đề nghị của bạn, tôi đã nhận nó làm việc bây giờ dựa trên đó. – Michael

+0

@Michael vui mừng khi nghe :) –

Các vấn đề liên quan