EF

2013-05-16 33 views
35

aşağıdaki varsayalım bir #temp tablosundan Saklı Yordam seçimi dönüş şema tahmin edemediği ya bana söyler:EF

seçilmiş saklı yordam veya işlev hiçbir sütunları

Bu nasıl üstesinden döner?

Diğer cevaplar diğer doing similar with views önermek, using table variablesfaking the return schema and commenting out the real stored procedure (performans nedenlerle yapmak için gitmiyorum) önermek ... ama gereksiz yükü eklemek zorunda veya bir saklı yordam kırmaya beni gerektirmeden bunu yapmanın bir yolu olmalı modeli güncellemek mi istiyorsunuz? Sonuç kümesi için bir sahte veri sözleşme temini

cevap

54
CREATE PROCEDURE [MySPROC] 
AS 
BEGIN 

--supplying a data contract 
IF 1 = 2 BEGIN 
    SELECT 
     cast(null as bigint) as MyPrimaryKey, 
     cast(null as int) as OtherColumn 
    WHERE 
     1 = 2 
END 

CREATE TABLE #tempSubset(
    [MyPrimaryKey] [bigint] NOT NULL, 
    [OtherColumn] [int]  NOT NULL) 

INSERT INTO #tempSubset (MyPrimaryKey, OtherColumn) 
    SELECT SomePrimaryKey, SomeColumn 
    FROM SomeHugeTable 
    WHERE LimitingCondition = true 

SELECT MyPrimaryKey, OtherColumn 
FROM #tempSubset 
WHERE SomeExpensiveCondition = true 

END 

sorunu bakmak için en kolay, en temiz ve en hızlı yoludur. Aynı sorun SSIS'deki veri kaynağı denetimlerinde de var. .NET, sorgunun erişilemeyen "sözleşmesi" bölümünden alınan sonucu okur ve karmaşık tür için meta verileri sağlar. Performans etkisi yok ve gerçek çalışmayı yapan SQL'i yorumlamaya gerek yok.

+0

ayrıntıları kontrol edebilirsiniz bu alternatiflere göre çok daha iyi o kadar büyük ve çalıştı! teşekkürler;) – JoeBrockhaus

+0

Test ettik ve harika çalışıyor! Ben oluşturmak için kullandıkları bir komut dosyasına ekler misin benim prosedürler Modelinizdeki bir Kompleksi Tipi oluşturursanız, bu biçimde veri sözleşme sağladıktan sonra, daha sonra özellikleri null olacağı – SleepyBoBos

+3

Not CREATE yani 'kamu null MyProperty {get; grubu;}).' Bu, db sütun değerinin boş olduğu durumu ele alacağından iyidir. Sözleşmede 'SELECT 1 AS [MyProperty column]' gibi bir şey yaparsanız, mülk 'public int MyProperty {get; set; } '(aslında [sproc] _Result sınıfını + karmaşık tipini silmeniz ve görülmesi gereken temel sProc'deki değişiklik için karmaşık tipte reçineler yapmanız gerekir). Durumunuza bağlı ya da bağımlı, sadece farkında olun. – SleepyBoBos

39

saklı yordam tanımı üstüne bu ekleme:

SET FMTONLY OFF
sorun olmadan geçici tablodan şema anlaması için bir model izin verdi. Bir bonus olarak, bir sözleşme için ek bakım gerektirmez.

Örnek:

SET FMTONLY OFF 

CREATE TABLE #tempTable (
    ... 
) 

... 

SELECT * FROM #tempTable 
+0

İhtiyacım olan şey bu ... – Mayank

+1

En basit ve en hızlı çözüm. Teşekkür ederim. – Xipooo

+0

Teşekkürler. Çok daha temiz bir çözüm. – Ashby

10

Çözüm 1 kullanın tablo değişkeni yerine geçici bir tablo.

Çözüm 2 Kullanım Seti FMTONLY kapalı; Prosedürde SQL komutu ve yeni bir karmaşık tip oluşturmak için sütun bilgilerini alırsınız.

Çözüm 3 Bu iyi bir yol değil, ama bu çok kolay bir yol. Sadece kukla verilerle bir seçim deyimi ekleyin ve 1 = 0 olduğundan çalışmayacak.

Eğer this link

+1

3 yaklaşımın hepsini denedim. Hiçbiri işe yaramadı. Her zaman 2 gün geç kaldığımdan beri 2 saatimi harcadım. Tasınmaya ihtiyacım var. Geçici çözümüm, kompozit tipini (prosedürü ve değişkeni bulun) değiştirmek ve int32'den string'e manüel olarak değiştirmek için model detaylarını görüntüleyecektir. Bu kötü bir fikir. Yenilerse, kaybolur. Diğer geliştiricilere hatırlatmak için bile belgelemiyorum. Herkes ne olduğunu öğrenir. Lütfen herkese haber verin. VS 2015, EF 6, SQL server 2016 kullanıyorum. TX – user12345