เบšเบฒเบ‡เบ”เป‰เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เปƒเบ™ C#.NET เบชเปเบฒเบฅเบฑเบš MS SQL Server

LINQ เป€เบ‚เบปเป‰เบฒ .NET เป€เบ›เบฑเบ™เบžเบฒเบชเบฒเบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปƒเปเปˆเบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. LINQ เบเบฑเบš SQL เป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบกเบฑเบ™เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบทเปˆเบชเบฒเบ™เบขเปˆเบฒเบ‡เบชเบฐเบ”เบงเบเบเบฑเบš DBMS เป‚เบ”เบเปƒเบŠเป‰, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, Entity Framework. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบกเบฑเบ™เป€เบฅเบทเป‰เบญเบเป†, เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบฅเบทเบกเป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡ SQL query เบœเบนเป‰เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡ Entity Framework เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบˆเบฐเบชเป‰เบฒเบ‡.

เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบชเบญเบ‡เบˆเบธเบ”เบ•เบปเป‰เบ™เบ•เปเป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡.
เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบชเป‰เบฒเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบปเบ”เบชเบญเบšเปƒเบ™ SQL Server, เปเบฅเบฐเบชเป‰เบฒเบ‡เบชเบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบ™เบกเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบ–เบฒเบกเบ•เปเปˆเป„เบ›เบ™เบตเป‰:

เบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡

USE [TEST]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Ref](
	[ID] [int] NOT NULL,
	[ID2] [int] NOT NULL,
	[Name] [nvarchar](255) NOT NULL,
	[InsertUTCDate] [datetime] NOT NULL,
 CONSTRAINT [PK_Ref] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Ref] ADD  CONSTRAINT [DF_Ref_InsertUTCDate]  DEFAULT (getutcdate()) FOR [InsertUTCDate]
GO

USE [TEST]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Customer](
	[ID] [int] NOT NULL,
	[Name] [nvarchar](255) NOT NULL,
	[Ref_ID] [int] NOT NULL,
	[InsertUTCDate] [datetime] NOT NULL,
	[Ref_ID2] [int] NOT NULL,
 CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Customer] ADD  CONSTRAINT [DF_Customer_Ref_ID]  DEFAULT ((0)) FOR [Ref_ID]
GO

ALTER TABLE [dbo].[Customer] ADD  CONSTRAINT [DF_Customer_InsertUTCDate]  DEFAULT (getutcdate()) FOR [InsertUTCDate]
GO

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ Ref เป‚เบ”เบเปเบฅเปˆเบ™เบชเบฐเบ„เบดเบšเบ•เปเปˆเป„เบ›เบ™เบตเป‰:

เบเบฒเบ™เบ•เบทเปˆเบกเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ Ref

USE [TEST]
GO

DECLARE @ind INT=1;

WHILE(@ind<1200000)
BEGIN
	INSERT INTO [dbo].[Ref]
           ([ID]
           ,[ID2]
           ,[Name])
    SELECT
           @ind
           ,@ind
           ,CAST(@ind AS NVARCHAR(255));

	SET @ind=@ind+1;
END 
GO

เปƒเบซเป‰เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบฅเบนเบเบ„เป‰เบฒเป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰เบชเบฐเบ„เบดเบšเบ•เปเปˆเป„เบ›เบ™เบตเป‰:

เบเบณเบฅเบฑเบ‡เบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบฅเบนเบเบ„เป‰เบฒ

USE [TEST]
GO

DECLARE @ind INT=1;
DECLARE @ind_ref INT=1;

WHILE(@ind<=12000000)
BEGIN
	IF(@ind%3=0) SET @ind_ref=1;
	ELSE IF (@ind%5=0) SET @ind_ref=2;
	ELSE IF (@ind%7=0) SET @ind_ref=3;
	ELSE IF (@ind%11=0) SET @ind_ref=4;
	ELSE IF (@ind%13=0) SET @ind_ref=5;
	ELSE IF (@ind%17=0) SET @ind_ref=6;
	ELSE IF (@ind%19=0) SET @ind_ref=7;
	ELSE IF (@ind%23=0) SET @ind_ref=8;
	ELSE IF (@ind%29=0) SET @ind_ref=9;
	ELSE IF (@ind%31=0) SET @ind_ref=10;
	ELSE IF (@ind%37=0) SET @ind_ref=11;
	ELSE SET @ind_ref=@ind%1190000;
	
	INSERT INTO [dbo].[Customer]
	           ([ID]
	           ,[Name]
	           ,[Ref_ID]
	           ,[Ref_ID2])
	     SELECT
	           @ind,
	           CAST(@ind AS NVARCHAR(255)),
	           @ind_ref,
	           @ind_ref;


	SET @ind=@ind+1;
END
GO

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบชเบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เบซเบ™เบถเปˆเบ‡เปƒเบ™เบ™เบฑเป‰เบ™เบกเบตเบ‚เปเป‰เบกเบนเบ™เบซเบผเบฒเบเบเบงเปˆเบฒ 1 เบฅเป‰เบฒเบ™เปเบ–เบง, เปเบฅเบฐเบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เบกเบตเบ‚เปเป‰เบกเบนเบ™เบซเบผเบฒเบเบเบงเปˆเบฒ 10 เบฅเป‰เบฒเบ™เปเบ–เบง.

เบ•เบญเบ™เบ™เบตเป‰เบขเบนเปˆเปƒเบ™ Visual Studio เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™ Visual C# Console App (.NET Framework) เบ—เบปเบ”เบชเบญเบš:

เบšเบฒเบ‡เบ”เป‰เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เปƒเบ™ C#.NET เบชเปเบฒเบฅเบฑเบš MS SQL Server

เบ•เปเปˆเป„เบ›, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบชเปเบฒเบฅเบฑเบš Entity Framework เป€เบžเบทเปˆเบญเบžเบปเบงเบžเบฑเบ™เบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.
เป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบกเบฑเบ™, เปƒเบซเป‰เบ„เบฅเบดเบเบ‚เบงเบฒเปƒเบชเปˆเป‚เบ„เบ‡เบเบฒเบ™เปเบฅเบฐเป€เบฅเบทเบญเบ Manage NuGet Packages เบˆเบฒเบเป€เบกเบ™เบนเบชเบฐเบžเบฒเบšเบเบฒเบ™:

เบšเบฒเบ‡เบ”เป‰เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เปƒเบ™ C#.NET เบชเปเบฒเบฅเบฑเบš MS SQL Server

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เปƒเบ™เบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบŠเบธเบ” NuGet เบ—เบตเปˆเบ›เบฒเบเบปเบ”, เปƒเบซเป‰เปƒเบชเปˆเบ„เปเบฒเบงเปˆเบฒ "Entity Framework" เปƒเบ™เบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบ„เบปเป‰เบ™เบซเบฒเปเบฅเบฐเป€เบฅเบทเบญเบเบŠเบธเบ” Entity Framework เปเบฅเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™:

เบšเบฒเบ‡เบ”เป‰เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เปƒเบ™ C#.NET เบชเปเบฒเบฅเบฑเบš MS SQL Server

เบ•เปเปˆเป„เบ›, เปƒเบ™เป„เบŸเบฅเปŒ App.config, เบซเบผเบฑเบ‡เบˆเบฒเบเบ›เบดเบ”เบญเบปเบ‡เบ›เบฐเบเบญเบš configSections, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเบšเบฅเบฑเบญเบเบ•เปเปˆเป„เบ›เบ™เบตเป‰:

<connectionStrings>
    <add name="DBConnection" connectionString="data source=ะ˜ะœะฏ_ะญะšะ—ะ•ะœะŸะ›ะฏะ ะ_MSSQL;Initial Catalog=TEST;Integrated Security=True;" providerName="System.Data.SqlClient" />
</connectionStrings>

เปƒเบ™ connectionString เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบชเปˆเบชเบฒเบเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ.

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡ 3 เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเปƒเบ™เป„เบŸเบฅเปŒเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ:

  1. เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš IBaseEntityID
    namespace TestLINQ
    {
        public interface IBaseEntityID
        {
            int ID { get; set; }
        }
    }
    

  2. เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš IBaseEntityName
    namespace TestLINQ
    {
        public interface IBaseEntityName
        {
            string Name { get; set; }
        }
    }
    

  3. เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš IBaseNameInsertUTCDate
    namespace TestLINQ
    {
        public interface IBaseNameInsertUTCDate
        {
            DateTime InsertUTCDate { get; set; }
        }
    }
    

เปเบฅเบฐเปƒเบ™เป„เบŸเบฅเปŒเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเป‰เบฒเบ‡เบŠเบฑเป‰เบ™เบžเบทเป‰เบ™เบ–เบฒเบ™ BaseEntity เบชเปเบฒเบฅเบฑเบšเบชเบญเบ‡เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ›เบฐเบเบญเบšเบกเบตเบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเบ—เบปเปˆเบงเป„เบ›:

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบŠเบฑเป‰เบ™เบžเบทเป‰เบ™เบ–เบฒเบ™ BaseEntity

namespace TestLINQ
{
    public class BaseEntity : IBaseEntityID, IBaseEntityName, IBaseNameInsertUTCDate
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public DateTime InsertUTCDate { get; set; }
    }
}

เบ•เปเปˆเป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเป‰เบฒเบ‡เบชเบญเบ‡เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปƒเบ™เป„เบŸเบฅเปŒเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ:

  1. เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™ Ref
    using System.ComponentModel.DataAnnotations.Schema;
    
    namespace TestLINQ
    {
        [Table("Ref")]
        public class Ref : BaseEntity
        {
            public int ID2 { get; set; }
        }
    }
    

  2. เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเป‰เบญเบ‡เบฎเบฝเบ™เบฅเบนเบเบ„เป‰เบฒ
    using System.ComponentModel.DataAnnotations.Schema;
    
    namespace TestLINQ
    {
        [Table("Customer")]
        public class Customer: BaseEntity
        {
            public int Ref_ID { get; set; }
            public int Ref_ID2 { get; set; }
        }
    }
    

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบชเป‰เบฒเบ‡เบšเปเบฅเบดเบšเบปเบ” UserContext เปƒเบ™เป„เบŸเบฅเปŒเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ:

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเป‰เบญเบ‡เบฎเบฝเบ™ UserContex

using System.Data.Entity;

namespace TestLINQ
{
    public class UserContext : DbContext
    {
        public UserContext()
            : base("DbConnection")
        {
            Database.SetInitializer<UserContext>(null);
        }

        public DbSet<Customer> Customer { get; set; }
        public DbSet<Ref> Ref { get; set; }
    }
}

เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ”เป‰เบงเบ LINQ เบเบฑเบš SQL เบœเปˆเบฒเบ™ EF เบชเปเบฒเบฅเบฑเบš MS SQL Server:

เบšเบฒเบ‡เบ”เป‰เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เปƒเบ™ C#.NET เบชเปเบฒเบฅเบฑเบš MS SQL Server

เบ•เบญเบ™เบ™เบตเป‰เปƒเบชเปˆเบฅเบฐเบซเบฑเบ”เบ•เปเปˆเป„เบ›เบ™เบตเป‰เปƒเบชเปˆเป„เบŸเบฅเปŒ Program.cs:

เป„เบŸเบฅเปŒ program.cs

using System;
using System.Collections.Generic;
using System.Linq;

namespace TestLINQ
{
    class Program
    {
        static void Main(string[] args)
        {
            using (UserContext db = new UserContext())
            {
                var dblog = new List<string>();
                db.Database.Log = dblog.Add;

                var query = from e1 in db.Customer
                            from e2 in db.Ref
                            where (e1.Ref_ID == e2.ID)
                                 && (e1.Ref_ID2 == e2.ID2)
                            select new { Data1 = e1.Name, Data2 = e2.Name };

                var result = query.Take(1000).ToList();

                Console.WriteLine(dblog[1]);

                Console.ReadKey();
            }
        }
    }
}

เบ•เปเปˆเป„เบ›, เปƒเบซเป‰เป€เบ›เบตเบ”เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ.

เปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ, เบ•เปเปˆเป„เบ›เบ™เบตเป‰เบˆเบฐเบ–เบทเบเบชเบฐเปเบ”เบ‡เบขเบนเปˆเปƒเบ™ console:

เบชเป‰เบฒเบ‡ SQL Query

SELECT TOP (1000) 
    [Extent1].[Ref_ID] AS [Ref_ID], 
    [Extent1].[Name] AS [Name], 
    [Extent2].[Name] AS [Name1]
    FROM  [dbo].[Customer] AS [Extent1]
    INNER JOIN [dbo].[Ref] AS [Extent2] ON ([Extent1].[Ref_ID] = [Extent2].[ID]) AND ([Extent1].[Ref_ID2] = [Extent2].[ID2])

เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบง, เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เป„เบ”เป‰เบชเป‰เบฒเบ‡เปเบšเบšเบชเบญเบšเบ–เบฒเบก SQL เบเบฑเบš MS SQL Server DBMS เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ”เบต.

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบ›เปˆเบฝเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚ AND เป€เบ›เบฑเบ™ OR เปƒเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ:

LINQ เบชเบญเบšเบ–เบฒเบก

var query = from e1 in db.Customer
                            from e2 in db.Ref
                            where (e1.Ref_ID == e2.ID)
                                || (e1.Ref_ID2 == e2.ID2)
                            select new { Data1 = e1.Name, Data2 = e2.Name };

เปเบฅเบฐเปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบ›เบตเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡.

เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบˆเบฐโ€‹เบ‚เบฑเบ”โ€‹เบเบฑเบšโ€‹เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹เป€เบ™เบทเปˆเบญเบ‡โ€‹เบˆเบฒเบโ€‹เบ—เบตเปˆโ€‹เปƒเบŠเป‰โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบ„เปเบฒโ€‹เบชเบฑเปˆเบ‡โ€‹เป€เบเบตเบ™ 30 เบงเบดโ€‹เบ™เบฒโ€‹เบ—เบตโ€‹:

เบšเบฒเบ‡เบ”เป‰เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เปƒเบ™ C#.NET เบชเปเบฒเบฅเบฑเบš MS SQL Server

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบšเบดเปˆเบ‡เปเบšเบšเบชเบญเบšเบ–เบฒเบกเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป‚เบ”เบ LINQ:

เบšเบฒเบ‡เบ”เป‰เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เปƒเบ™ C#.NET เบชเปเบฒเบฅเบฑเบš MS SQL Server
, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบเบฒเบ™เบ„เบฑเบ”เป€เบฅเบทเบญเบเป€เบเบตเบ”เบ‚เบถเป‰เบ™เป‚เบ”เบเบœเปˆเบฒเบ™เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™ Cartesian เบ‚เบญเบ‡เบชเบญเบ‡เบŠเบธเบ” (เบ•เบฒเบ•เบฐเบฅเบฒเบ‡):

เบชเป‰เบฒเบ‡ SQL Query

SELECT TOP (1000) 
    [Extent1].[Ref_ID] AS [Ref_ID], 
    [Extent1].[Name] AS [Name], 
    [Extent2].[Name] AS [Name1]
    FROM  [dbo].[Customer] AS [Extent1]
    CROSS JOIN [dbo].[Ref] AS [Extent2]
    WHERE [Extent1].[Ref_ID] = [Extent2].[ID] OR [Extent1].[Ref_ID2] = [Extent2].[ID2]

เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบ‚เบฝเบ™เบ„เบทเบ™เบ„เปเบฒเบ–เบฒเบก LINQ เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”

var query = (from e1 in db.Customer
                   join e2 in db.Ref
                   on e1.Ref_ID equals e2.ID
                   select new { Data1 = e1.Name, Data2 = e2.Name }).Union(
                        from e1 in db.Customer
                        join e2 in db.Ref
                        on e1.Ref_ID2 equals e2.ID2
                        select new { Data1 = e1.Name, Data2 = e2.Name });

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก SQL เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

SQL เบชเบญเบšเบ–เบฒเบก

SELECT 
    [Limit1].[C1] AS [C1], 
    [Limit1].[C2] AS [C2], 
    [Limit1].[C3] AS [C3]
    FROM ( SELECT DISTINCT TOP (1000) 
        [UnionAll1].[C1] AS [C1], 
        [UnionAll1].[Name] AS [C2], 
        [UnionAll1].[Name1] AS [C3]
        FROM  (SELECT 
            1 AS [C1], 
            [Extent1].[Name] AS [Name], 
            [Extent2].[Name] AS [Name1]
            FROM  [dbo].[Customer] AS [Extent1]
            INNER JOIN [dbo].[Ref] AS [Extent2] ON [Extent1].[Ref_ID] = [Extent2].[ID]
        UNION ALL
            SELECT 
            1 AS [C1], 
            [Extent3].[Name] AS [Name], 
            [Extent4].[Name] AS [Name1]
            FROM  [dbo].[Customer] AS [Extent3]
            INNER JOIN [dbo].[Ref] AS [Extent4] ON [Extent3].[Ref_ID2] = [Extent4].[ID2]) AS [UnionAll1]
    )  AS [Limit1]

เบญเบฐเบ™เบดเบˆเบฒ, เปƒเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เบกเบตเบžเบฝเบ‡เปเบ•เปˆเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ—เบตเปˆเบ—เบฝเบšเป€เบ—เบปเปˆเบฒเป‚เบ”เบเปƒเบŠเป‰เบชเบญเบ‡เปเบšเบšเบชเบญเบšเบ–เบฒเบกเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบชเบปเบกเบ—เบปเบšเบžเบงเบเบกเบฑเบ™เบœเปˆเบฒเบ™เบชเบฐเบซเบฐเบžเบฑเบ™เป€เบžเบทเปˆเบญเป€เบญเบปเบฒเบเบฒเบ™เบŠเป‰เปเบฒเบเบฑเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เปเบ–เบง.
เปเบกเปˆเบ™เปเบฅเป‰เบง, เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบงเบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบˆเบฐเบšเปเปˆเบ—เบฝเบšเป€เบ—เบปเปˆเบฒ, เป‚เบ”เบเบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เปเบ–เบงเบ—เบตเปˆเบŠเป‰เปเบฒเบเบฑเบ™เบ—เบตเปˆเบชเบปเบกเบšเบนเบ™เบญเบฒเบ”เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เปƒเบ™เบŠเบตเบงเบดเบ”เบˆเบดเบ‡, เป€เบชเบฑเป‰เบ™เบŠเป‰เปเบฒเบŠเป‰เบญเบ™เบ—เบตเปˆเบชเบปเบกเบšเบนเบ™เปเบกเปˆเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เปเบฅเบฐเบ›เบฐเบŠเบฒเบŠเบปเบ™เบžเบฐเบเบฒเบเบฒเบกเบเปเบฒเบˆเบฑเบ”เบžเบงเบเบกเบฑเบ™.

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบ›เบฝเบšเบ—เบฝเบšเปเบœเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบชเบญเบ‡เบ„เปเบฒเบ–เบฒเบกเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰:

  1. เบชเปเบฒเบฅเบฑเบš CROSS JOIN เป€เบงเบฅเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ”เบเบชเบฐเป€เบฅเปˆเบเปเบกเปˆเบ™ 195 เบงเบดเบ™เบฒเบ—เบต:
    เบšเบฒเบ‡เบ”เป‰เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เปƒเบ™ C#.NET เบชเปเบฒเบฅเบฑเบš MS SQL Server
  2. เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เบฎเปˆเบงเบกโ€‹เบžเบฒเบโ€‹เปƒเบ™โ€‹เบชเบฐโ€‹เบซเบฐโ€‹เบžเบฒเบšโ€‹เบ—เบตเปˆโ€‹เปƒเบŠเป‰โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เป‚เบ”เบโ€‹เบชเบฐโ€‹เป€เบฅเปˆเบโ€‹เปเบกเปˆเบ™โ€‹เบซเบ™เป‰เบญเบโ€‹เบโ€‹เปˆโ€‹เบงเบฒ 24 เบงเบดโ€‹เบ™เบฒโ€‹เบ—เบตโ€‹:
    เบšเบฒเบ‡เบ”เป‰เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เปƒเบ™ C#.NET เบชเปเบฒเบฅเบฑเบš MS SQL Server

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เบˆเบฒเบเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš, เบชเปเบฒเบฅเบฑเบšเบชเบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบตเบšเบฑเบ™เบ—เบถเบเบซเบผเบฒเบเบฅเป‰เบฒเบ™, เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เบ—เบตเปˆเบ–เบทเบเบ›เบฑเบšเบ›เบธเบ‡เปเบกเปˆเบ™เป„เบงเบเบงเปˆเบฒเบซเบผเบฒเบเป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡.

เบชเปเบฒเบฅเบฑเบšเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบกเบต AND เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚, เบ„เปเบฒเบ–เบฒเบก LINQ เบ‚เบญเบ‡เปเบšเบšเบŸเบญเบก:

LINQ เบชเบญเบšเบ–เบฒเบก

var query = from e1 in db.Customer
                            from e2 in db.Ref
                            where (e1.Ref_ID == e2.ID)
                                 && (e1.Ref_ID2 == e2.ID2)
                            select new { Data1 = e1.Name, Data2 = e2.Name };

เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก SQL เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เป€เบเบทเบญเบšเบˆเบฐเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบ•เบฐเบซเบผเบญเบ”เป€เบงเบฅเบฒ, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป‚เบ”เบเบชเบฐเป€เบฅเปˆเบเปƒเบ™เบ›เบฐเบกเบฒเบ™ 1 เบงเบดเบ™เบฒเบ—เบต:

เบšเบฒเบ‡เบ”เป‰เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เปƒเบ™ C#.NET เบชเปเบฒเบฅเบฑเบš MS SQL Server
เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบซเบกเบนเบ™เปƒเบŠเป‰ LINQ เบเบฑเบš Objects เปเบ—เบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเป€เบŠเบฑเปˆเบ™:

เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ (เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบต 1)

var query = from e1 in seq1
                            from e2 in seq2
                            where (e1.Key1==e2.Key1)
                               && (e1.Key2==e2.Key2)
                            select new { Data1 = e1.Data, Data2 = e2.Data };

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเบ–เบฒเบกเป€เบŠเบฑเปˆเบ™:

เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ (เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบต 2)

var query = from e1 in seq1
                            join e2 in seq2
                            on new { e1.Key1, e1.Key2 } equals new { e2.Key1, e2.Key2 }
                            select new { Data1 = e1.Data, Data2 = e2.Data };

เบšเปˆเบญเบ™เบ—เบตเปˆ:

เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบชเบญเบ‡ arrays

Para[] seq1 = new[] { new Para { Key1 = 1, Key2 = 2, Data = "777" }, new Para { Key1 = 2, Key2 = 3, Data = "888" }, new Para { Key1 = 3, Key2 = 4, Data = "999" } };
Para[] seq2 = new[] { new Para { Key1 = 1, Key2 = 2, Data = "777" }, new Para { Key1 = 2, Key2 = 3, Data = "888" }, new Para { Key1 = 3, Key2 = 5, Data = "999" } };

, เปเบฅเบฐโ€‹เบ›เบฐโ€‹เป€เบžเบ” Para เปเบกเปˆเบ™โ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เบ”เบฑเปˆเบ‡โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹:

เบ„เปเบฒเบ™เบดเบเบฒเบกเบ›เบฐเป€เบžเบ” Para

class Para
{
        public int Key1, Key2;
        public string Data;
}

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡เบšเบฒเบ‡เบ”เป‰เบฒเบ™เปƒเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เบเบฑเบš MS SQL Server.

เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒ .NET เบ—เบตเปˆเบกเบตเบ›เบฐเบชเบปเบšเบเบฒเบ™เปเบฅเบฐเบŠเบฑเป‰เบ™เบ™เปเบฒเบเปเปˆเบฅเบทเบกเบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบ‚เบปเป‰เบฒเปƒเบˆเบชเบดเปˆเบ‡เบ—เบตเปˆเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเปƒเบŠเป‰เป€เบฎเบฑเบ”เบขเบนเปˆเป€เบšเบทเป‰เบญเบ‡เบซเบผเบฑเบ‡. เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเบกเบฑเบ™เบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™เบ•เบปเบงเบ•เบฑเป‰เบ‡เบ•เบปเบงเบ•เบตเปเบฅเบฐเบชเบฒเบกเบฒเบ”เบ›เบนเบเบฅเบนเบเบฅเบฐเป€เบšเบตเบ”เป€เบงเบฅเบฒเปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”เบ—เบฑเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ›เบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”เบเบฒเบ™เปเบเป‰เป„เบ‚เบŠเบญเบšเปเบงเปเบฅเบฐเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบžเบฒเบเบ™เบญเบ.

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบชเบฑเป‰เบ™เบเบฑเบ‡เป„เบ”เป‰เบ”เปเบฒเป€เบ™เบตเบ™ เบ—เบตเปˆเบ™เบตเป‰.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš - เป‚เบ„เบ‡เบเบฒเบ™เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡, เบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ TEST, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบขเบนเปˆ. เบ—เบตเปˆเบ™เบตเป‰.
เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบ™เบตเป‰, เปƒเบ™เป‚เบŸเบ™เป€เบ”เบต Plans, เบกเบตเปเบœเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ—เบตเปˆเบกเบตเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚ OR.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™