पार्टी में पांच साल की देरी।
यह स्वीकार किए गए उत्तर के दिए गए लिंक में उल्लिखित है, लेकिन मुझे लगता है कि यह SO पर एक स्पष्ट उत्तर के हकदार है - प्रदान किए गए मापदंडों के आधार पर गतिशील रूप से क्वेरी का निर्माण। उदाहरण के लिए:
सेट अप
-- drop table Person
create table Person
(
PersonId INT NOT NULL IDENTITY(1, 1) CONSTRAINT PK_Person PRIMARY KEY,
FirstName NVARCHAR(64) NOT NULL,
LastName NVARCHAR(64) NOT NULL,
Title NVARCHAR(64) NULL
)
GO
INSERT INTO Person (FirstName, LastName, Title)
VALUES ('Dick', 'Ormsby', 'Mr'), ('Serena', 'Kroeger', 'Ms'),
('Marina', 'Losoya', 'Mrs'), ('Shakita', 'Grate', 'Ms'),
('Bethann', 'Zellner', 'Ms'), ('Dexter', 'Shaw', 'Mr'),
('Zona', 'Halligan', 'Ms'), ('Fiona', 'Cassity', 'Ms'),
('Sherron', 'Janowski', 'Ms'), ('Melinda', 'Cormier', 'Ms')
GO
प्रक्रिया
ALTER PROCEDURE spDoSearch
@FirstName varchar(64) = null,
@LastName varchar(64) = null,
@Title varchar(64) = null,
@TopCount INT = 100
AS
BEGIN
DECLARE @SQL NVARCHAR(4000) = '
SELECT TOP ' + CAST(@TopCount AS VARCHAR) + ' *
FROM Person
WHERE 1 = 1'
PRINT @SQL
IF (@FirstName IS NOT NULL) SET @SQL = @SQL + ' AND FirstName = @FirstName'
IF (@LastName IS NOT NULL) SET @SQL = @SQL + ' AND FirstName = @LastName'
IF (@Title IS NOT NULL) SET @SQL = @SQL + ' AND Title = @Title'
EXEC sp_executesql @SQL, N'@TopCount INT, @FirstName varchar(25), @LastName varchar(25), @Title varchar(64)',
@TopCount, @FirstName, @LastName, @Title
END
GO
प्रयोग
exec spDoSearch @TopCount = 3
exec spDoSearch @FirstName = 'Dick'
पेशेवरों:
- लिखना और समझना आसान है
- लचीलापन - आसानी से ट्रिकियर फ़िल्टरिंग (जैसे गतिशील टॉप) के लिए क्वेरी उत्पन्न करें
विपक्ष:
- उपलब्ध मापदंडों, अनुक्रमित और डेटा की मात्रा के आधार पर संभावित प्रदर्शन समस्याएं
सीधे जवाब नहीं, लेकिन समस्या उर्फ बड़ी तस्वीर से संबंधित है
आमतौर पर, ये फ़िल्टरिंग संग्रहीत कार्यविधियाँ आसपास नहीं तैरती हैं, लेकिन कुछ सेवा स्तर से कॉल की जा रही हैं। यह SQL से सर्विस लेयर तक बिजनेस लॉजिक (फ़िल्टरिंग) को स्थानांतरित करने का विकल्प छोड़ देता है।
एक उदाहरण प्रदान की गई फिल्टर के आधार पर क्वेरी उत्पन्न करने के लिए LINQ2SQL का उपयोग कर रहा है:
public IList<SomeServiceModel> GetServiceModels(CustomFilter filters)
{
var query = DataAccess.SomeRepository.AllNoTracking;
// partial and insensitive search
if (!string.IsNullOrWhiteSpace(filters.SomeName))
query = query.Where(item => item.SomeName.IndexOf(filters.SomeName, StringComparison.OrdinalIgnoreCase) != -1);
// filter by multiple selection
if ((filters.CreatedByList?.Count ?? 0) > 0)
query = query.Where(item => filters.CreatedByList.Contains(item.CreatedById));
if (filters.EnabledOnly)
query = query.Where(item => item.IsEnabled);
var modelList = query.ToList();
var serviceModelList = MappingService.MapEx<SomeDataModel, SomeServiceModel>(modelList);
return serviceModelList;
}
पेशेवरों:
- प्रदान किए गए फ़िल्टर के आधार पर गतिशील रूप से उत्पन्न क्वेरी। कोई पैरामीटर सूँघने या recompile संकेत की जरूरत नहीं है
- OOP दुनिया में उन लोगों के लिए लिखने के लिए कुछ आसान है
- आम तौर पर अनुकूल प्रदर्शन, चूंकि "सरल" प्रश्नों को जारी किया जाएगा (उपयुक्त अनुक्रमित अभी भी हालांकि आवश्यक हैं)
विपक्ष:
- LINQ2QL सीमाएँ तक पहुँचा जा सकता है और LINQ2Objects के लिए एक डाउनग्रेड मजबूर कर रहा है या मामले के आधार पर शुद्ध SQL समाधान पर वापस जा रहा है
- LINQ के लापरवाह लेखन से भयानक प्रश्न उत्पन्न हो सकते हैं (या कई प्रश्न, यदि नेविगेशन गुण लोड हैं)