ืขื˜ืœืขื›ืข ืึทืกืคึผืขืงืฅ ืคื•ืŸ ืึธืคึผื˜ื™ืžื™ื–ื™ื ื’ LINQ ืงื•ื•ื™ืจื™ื– ืื™ืŸ C #.NET ืคึฟืึทืจ MS SQL Server

LINQ ืื™ื– ืืจื™ื™ืŸ ืื™ืŸ .NET ื•ื•ื™ ืึท ืฉื˜ืึทืจืง ื ื™ื™ึทืข ื“ืึทื˜ืŸ ืžืึทื ื™ืคึผื™ืึทืœื™ื™ืฉืึทืŸ ืฉืคึผืจืึทืš. LINQ ืฆื• SQL ื•ื•ื™ ืึท ื˜ื™ื™ืœ ืคื•ืŸ ืขืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ื™ื‘ืขืจื’ืขื‘ืŸ ื’ืึทื ืฅ ืงืึทื ื•ื•ื™ื ื™ืึทื ื˜ืœื™ ืžื™ื˜ ืึท DBMS ื ื™ืฆืŸ, ืœืžืฉืœ, Entity Framework. ืึธื‘ืขืจ, ื ื™ืฆืŸ ืขืก ื’ืึทื ืฅ ืึธืคื˜, ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืคืึทืจื’ืขืกืŸ ืฆื• ืงื•ืงืŸ ืื™ืŸ ื•ื•ืึธืก ืกืึธืจื˜ ืคื•ืŸ ืกืงืœ ืึธื ืคึฟืจืขื’ ื“ื™ ืงื•ื•ืขืจื™ืึทื‘ืœืข ืฉืคึผื™ื™ึทื–ืขืจ, ืื™ืŸ ื“ื™ื™ืŸ ืคืึทืœ, ืขื ื˜ื™ื˜ื™ ืคืจืึทืžืขื•ื•ืึธืจืง, ื•ื•ืขื˜ ื“ื–ืฉืขื ืขืจื™ื™ื˜.

ืœืึธืžื™ืจ ืงื•ืงืŸ ืื•ื™ืฃ ืฆื•ื•ื™ื™ ื”ื•ื™ืคึผื˜ ืคื•ื ืงื˜ืŸ ื ื™ืฆืŸ ืึท ื‘ื™ื™ึทืฉืคึผื™ืœ.
ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืฉืึทืคึฟืŸ ืึท ื˜ืขืกื˜ ื“ืึทื˜ืึทื‘ื™ื™ืก ืื™ืŸ SQL ืกืขืจื•ื•ื™ืจืขืจ ืื•ืŸ ืฉืึทืคึฟืŸ ืฆื•ื•ื™ื™ ื˜ื™ืฉืŸ ืื™ืŸ ืขืก ืžื™ื˜ ื“ื™ ืคืืœื’ืขื ื“ืข ืึธื ืคึฟืจืขื’:

ืฉืืคืŸ ื˜ืึทื‘ืœืขืก

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

ืื™ืฆื˜ ืœืึธื–ืŸ ืื•ื ื“ื– ื‘ืึทืคืขืœืงืขืจืŸ ื“ื™ ืจืขืฃ ื˜ื™ืฉ ื“ื•ืจืš ืœื•ื™ืคืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืฉืจื™ืคื˜:

ืคื™ืœื•ื ื’ ื“ื™ ืจืขืฃ ื˜ื™ืฉ

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 ืžื™ืœื™ืึธืŸ ืจืึธื•ื– ืคื•ืŸ ื“ืึทื˜ืŸ.

ืื™ืฆื˜ ืื™ืŸ ื•ื•ื™ืกื•ืึทืœ ืกื˜ื•ื“ื™ืึธ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฉืึทืคึฟืŸ ืึท ืคึผืจืึธื‘ืข ื•ื•ื™ืกื•ืึทืœ C # ืงืึทื ืกืึธื•ืœ ืึทืคึผ (.ื ืขื˜ ืคืจืึทืžืขื•ื•ืึธืจืง) ืคึผืจื•ื™ืขืงื˜:

ืขื˜ืœืขื›ืข ืึทืกืคึผืขืงืฅ ืคื•ืŸ ืึธืคึผื˜ื™ืžื™ื–ื™ื ื’ LINQ ืงื•ื•ื™ืจื™ื– ืื™ืŸ C #.NET ืคึฟืึทืจ MS SQL Server

ื“ืขืจื ืึธืš ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืœื™ื™ื’ืŸ ืึท ื‘ื™ื‘ืœื™ืึธื˜ืขืง ืคึฟืึทืจ ื“ื™ ืขื ื˜ื™ื˜ื™ ืคืจืึทืžืขื•ื•ืึธืจืง ืฆื• ื™ื ื˜ืขืจืึทืงื˜ ืžื™ื˜ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก.
ืฆื• ืœื™ื™ื’ืŸ ืขืก, ืจืขื›ื˜ ื’ื™ื˜ ืื•ื™ืฃ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื•ืŸ ืกืขืœืขืงื˜ื™ืจืŸ 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. ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ืจืขืฃ ืงืœืึทืก
    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();
            }
        }
    }
}

ื•ื•ื™ื™ึทื˜ืขืจ, ืœืึธื–ืŸ ืื•ื ื“ื– ืงืึทื˜ืขืจ ืื•ื ื“ื–ืขืจ ืคึผืจื•ื™ืขืงื˜.

ืื™ืŸ ื“ื™ ืกื•ืฃ ืคื•ืŸ ื“ื™ ืึทืจื‘ืขื˜, ื“ื™ ืคืืœื’ืขื ื“ืข ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื–ืŸ ืื•ื™ืฃ ื“ื™ ืงืึทื ืกืึธื•ืœ:

ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ืกืงืœ ืึธื ืคึฟืจืขื’

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 ืึธื ืคึฟืจืขื’ ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ืึท ืกืงืœ ืึธื ืคึฟืจืขื’ ืฆื• ื“ื™ 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
, ื“ืขืžืึธืœื˜ ืื™ืจ ืงืขื ืขืŸ ืžืึทื›ืŸ ื–ื™ื›ืขืจ ืึทื– ื“ื™ ืกืขืœืขืงืฆื™ืข ืึทืงืขืจื– ื“ื•ืจืš ื“ื™ ืงืึทืจื˜ืขืกื™ืึทืŸ ืคึผืจืึธื“ื•ืงื˜ ืคื•ืŸ ืฆื•ื•ื™ื™ ืฉื˜ืขืœื˜ (ื˜ื™ืฉืŸ):

ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ืกืงืœ ืึธื ืคึฟืจืขื’

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. ืคึฟืึทืจ ื™ื ืขืจ JOIN-UNION ื“ื™ ื“ื•ืจื›ืฉื ื™ื˜ืœืขืš ื“ื•ืจื›ืคื™ืจื•ื ื’ ืฆื™ื™ื˜ ืื™ื– ื•ื•ื™ื™ื ื™ืงืขืจ ื•ื•ื™ 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 ืฆื• ืึธื‘ื“ื–ืฉืขืงืฅ ืžืึทื ื™ืคึผื™ืึทืœื™ื™ืฉืึทื ื– ืึทื ืฉื˜ืึธื˜ ืคื•ืŸ ืึท ืึธื ืคึฟืจืขื’ ื•ื•ื™:

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 };

ื•ื•ื•:

ื“ืขืคื™ื ื™ืจืŸ ืฆื•ื•ื™ื™ ืขืจื™ื™ื–

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" } };

, ืื•ืŸ ื“ื™ ืคึผืึทืจืึท ื˜ื™ืคึผ ืื™ื– ื“ื™ืคื™ื™ื ื“ ื•ื•ื™ ื’ื™ื™ื˜:

ืคึผืึทืจืึท ื˜ื™ืคึผ ื“ืขืคึฟื™ื ื™ืฆื™ืข

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

ืื–ื•ื™, ืžื™ืจ ื™ื’ื–ืึทืžืึทื ื“ ืขื˜ืœืขื›ืข ืึทืกืคึผืขืงืฅ ืื™ืŸ ืึธืคึผื˜ื™ืžื™ื–ื™ื ื’ LINQ ืงื•ื•ื™ืจื™ื– ืฆื• MS SQL Server.

ืฆื•ื ื‘ืึทื“ื•ื™ืขืจืŸ, ืืคื™ืœื• ื™ืงืกืคึผื™ืจื™ืึทื ืกื˜ ืื•ืŸ ืœื™ื“ื™ื ื’ .NET ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืคืึทืจื’ืขืกืŸ ืึทื– ื–ื™ื™ ื“ืึทืจืคึฟืŸ ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื•ื•ืึธืก ื“ื™ ื™ื ืกื˜ืจืึทืงืฉืึทื ื– ื–ื™ื™ ื ื•ืฆืŸ ื˜ืึธืŸ ื”ื™ื ื˜ืขืจ ื“ื™ ืกื™ื ื–. ืึทื ื“ืขืจืฉ, ื–ื™ื™ ื•ื•ืขืจืŸ ืงืึธื ืคื™ื’ื•ืจืึทื˜ืึธืจืก ืื•ืŸ ืงืขื ืขืŸ ืคืึทื‘ืจื™ืง ืึท ืฆื™ื™ื˜ ื‘ืึธืžื‘ืข ืื™ืŸ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜ ื‘ื™ื™ื“ืข ื•ื•ืขืŸ ืกืงื™ื™ืœื™ื ื’ ื“ื™ ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืœื™ื™ื–ื•ื ื’ ืื•ืŸ ืžื™ื˜ ืžื™ื ืขืจื•ื•ืขืจื˜ื™ืง ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ื™ื ื•ื•ื™ื™ืจืึทื ืžืขื ืึทืœ ื˜ื ืึธื™ื.

ื ืงื•ืจืฆืข ืจืขืฆืขื ื–ื™ืข ืื™ื– ืื•ื™ืš ื“ื•ืจื›ื’ืขืคื™ืจื˜ ื’ืขื•ื•ืืจืŸ ื“ืึธ.

ื“ื™ ืงื•ื•ืืœืŸ ืคึฟืึทืจ ื“ื™ ืคึผืจืึธื‘ืข - ื“ื™ ืคึผืจื•ื™ืขืงื˜ ื–ื™ืš, ื“ื™ ืฉืึทืคื•ื ื’ ืคื•ืŸ ื˜ื™ืฉืŸ ืื™ืŸ ื“ื™ TEST ื“ืึทื˜ืึทื‘ื™ื™ืก, ืื•ืŸ ืคื™ืœื•ื ื’ ื“ื™ ื˜ื™ืฉืŸ ืžื™ื˜ ื“ืึทื˜ืŸ ื–ืขื ืขืŸ ืœื™ื’ืŸ ื“ืึธ.
ืื•ื™ืš ืื™ืŸ ื“ืขื ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™, ืื™ืŸ ื“ื™ ืคึผืœืึทื ืก ื˜ืขืงืข, ืขืก ื–ืขื ืขืŸ ืคึผืœืึทื ื– ืคึฟืึทืจ ืขืงืกืึทืงื™ื•ื˜ื™ื ื’ ืงื•ื•ื™ืจื™ื– ืžื™ื˜ OR ื˜ื ืึธื™ื.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’