2012-05-29 8 views
5

मैं एक खोज इंटरनेट दौर लिया है और कुछ भी सीधे मेल खाता है कि मैं क्या कर रहा हूँ के बाद नहीं मिल सकता है कर सकते हैं ....मैं कैसे LINQ के माध्यम से चर स्तंभ लंबाई लौट SQL को

मैं एक संग्रहीत प्रक्रिया है कि रिटर्न है स्तंभों का एक निश्चित सेट (मान लें कॉलम, कॉलम बी और कॉलमसी) और फिर अतिरिक्त कॉलम के एक अनिश्चित संख्या/हस्ताक्षर (शायद कॉलम, कॉलम और कॉलमएफ, या कॉलमएफ, कॉलमप, कॉलमेट और कॉलमडब्ल्यू) लौटाते हैं।

क्वेरी का गतिशील भाग proc के लिए एक आईडी param द्वारा निर्धारित किया जाता है।

दुर्भाग्यवश मैं स्कीमा के नियंत्रण में नहीं हूं और इसे एक अतिरिक्त तालिका (ओं) के बजाय अंत में जोड़े गए असंबद्ध कॉलम की बहुत बड़ी संख्या के लिए खराब रूप से डिजाइन किया गया है (और वे उन्हें जोड़ते रहते हैं) इसे प्रभावी ढंग से स्टोर करें।

नतीजतन, मैं संकलन समय पर कॉलम का एक निश्चित सेट वापस करने में असमर्थ हूं, इसलिए LINQ से SQL संग्रहीत प्रक्रिया के रिटर्न प्रकार को निर्धारित नहीं कर सकता है।

क्या मेरे पास कोई अन्य विकल्प है, या जिस तरीके से मैं इसे प्राप्त कर सकता हूं? यहां एक उदाहरण दिया गया है कि मैं नीचे क्या कर रहा हूं। क्या मैं LINQ से SQL के साथ काम करने के लिए इसे फिर से लिख सकता हूं? यदि मैं मदद करता हूं तो मैं सी # और एसक्यूएल सर्वर 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 

उत्तर

6

आप न केवल एक SQL Data Adapter कि एक DataSet भरता है का उपयोग कर सकते हैं? इसके बाद आप डेटासेट को LINQ का उपयोग करें और अपने 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

अपने सुझाव के लिए धन्यवाद, मैं इसे अब कि के आधार पर कार्य मिला है। – Michael

+0

@ माइकल सुनकर खुशी हुई :) –