পাঁচ বছর দেরিতে পার্টিতে।
এটি গৃহীত উত্তরের প্রদত্ত লিঙ্কগুলিতে উল্লেখ করা হয়েছে, তবে আমি মনে করি এটি এসও-তে একটি স্পষ্ট উত্তরের প্রাপ্য - সরবরাহিত পরামিতিগুলির উপর ভিত্তি করে কোয়েরিটি গতিশীলভাবে তৈরি করা। উদাহরণ:
সেটআপ
-- 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'
পেশাদাররা:
- লিখতে এবং বুঝতে সহজ
- নমনীয়তা - সহজেই কৌশলযুক্ত ফিল্টারিংয়ের জন্য ক্যোয়ারী উত্পন্ন করুন (যেমন ডায়নামিক শীর্ষ)
কনস:
- প্রদত্ত প্যারামিটার, সূচক এবং ডেটা ভলিউমের উপর নির্ভর করে সম্ভাব্য পারফরম্যান্স সমস্যা
সরাসরি উত্তর নয়, তবে সমস্যাটির সাথে সম্পর্কিত বড় ছবি aka
সাধারণত, এই ফিল্টারিং সঞ্চিত পদ্ধতিগুলি প্রায় ভাসমান নয়, তবে কিছু পরিষেবা স্তর থেকে কল করা হচ্ছে। এটি এসকিউএল থেকে পরিষেবা স্তরে ব্যবসায়িক যুক্তি (ফিল্টারিং) সরিয়ে যাওয়ার বিকল্প ছেড়ে দেয়।
একটি উদাহরণ সরবরাহিত ফিল্টারগুলির উপর ভিত্তি করে ক্যোয়ারী উত্পন্ন করতে 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;
}
পেশাদাররা:
- সরবরাহকৃত ফিল্টারগুলির উপর ভিত্তি করে গতিময়ভাবে উত্পন্ন উত্স query কোনও প্যারামিটার স্নিফিং বা পুনরায় সংকলনের ইঙ্গিতগুলির প্রয়োজন নেই
- ওওপি বিশ্বে যারা লেখেন তাদের পক্ষে কিছুটা সহজ
- সাধারণত পারফরম্যান্স বান্ধব, যেহেতু "সরল" প্রশ্নগুলি জারি করা হবে (যথাযথ সূচীগুলি এখনও প্রয়োজন)
কনস:
- লাইনকিউ 2 কিউএল সীমাবদ্ধতাগুলি পৌঁছে যেতে পারে এবং লিনকুই 2 সংস্থাগুলিতে একটি ডাউনগ্রেড জোর করে বা কেসের উপর নির্ভর করে খাঁটি এসকিউএল সমাধানে ফিরে যেতে পারে
- লিনকিউ-এর গাফিল লেখার ফলে ভয়াবহ প্রশ্ন উত্পন্ন হতে পারে (বা অনেক প্রশ্ন, যদি নেভিগেশন সম্পত্তি লোড করা থাকে)