LINQ Π½Π°Π²Π»Π΅Π·Π΅ Π² .NET ΠΊΠ°ΡΠΎ Π½ΠΎΠ² ΠΌΠΎΡΠ΅Π½ Π΅Π·ΠΈΠΊ Π·Π° ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΈΡ Ρ Π΄Π°Π½Π½ΠΈ. LINQ to SQL ΠΊΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ Π½Π΅Π³ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΠ΄ΠΎΠ±Π½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Entity Framework. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΡΠ΅ΡΡΠΎ ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° LINQ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π·Π°Π±ΡΠ°Π²ΡΡ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΡ ΠΊΠ°ΠΊΠ²ΠΈ SQL Π·Π°ΡΠ²ΠΊΠΈ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° queryable provider, Π² ΡΠ»ΡΡΠ°Ρ β Entity Framework.
ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π²Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ°.
ΠΠ° ΡΠ΅Π»ΡΠ° Π² SQL Server ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Test ΠΈ Π² Π½Π΅Ρ ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π΄Π²Π΅ ΡΠ°Π±Π»ΠΈΡΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΡ Π·Π°ΡΠ²ΠΊΠ°:
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈ
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
ΠΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½ Π½Π°ΡΠΈΠ½ ΡΠ΅ Π·Π°ΠΏΡΠ»Π½ΠΈΠΌ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Customer Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡ:
ΠΠ°ΠΏΡΠ»Π²Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Customer
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=0) SET @ind_ref=4;
ELSE IF (@ind=0) SET @ind_ref=5;
ELSE IF (@ind=0) SET @ind_ref=6;
ELSE IF (@ind=0) SET @ind_ref=7;
ELSE IF (@ind=0) SET @ind_ref=8;
ELSE IF (@ind=0) SET @ind_ref=9;
ELSE IF (@ind=0) SET @ind_ref=10;
ELSE IF (@ind=0) SET @ind_ref=11;
ELSE SET @ind_ref=@ind90000;
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):

Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π° Entity Framework Π·Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ.
ΠΠ° Π΄Π° Π³ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ, ΡΡΠ°ΠΊΠ²Π°ΠΌΠ΅ Ρ Π΄Π΅ΡΠ½ΠΈΡ Π±ΡΡΠΎΠ½ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΠΎΡΠΎ ΠΌΠ΅Π½Ρ ΠΈΠ·Π±ΠΈΡΠ°ΠΌΠ΅ Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° NuGet ΠΏΠ°ΠΊΠ΅ΡΠΈ:

Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π² ΠΏΠΎΡΠ²ΠΈΠ»ΠΎΡΠΎ ΡΠ΅ ΠΏΡΠΎΠ·ΠΎΡΡΠ΅ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° NuGet ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅ Π²ΡΠ² ΠΏΠΎΠ»Π΅ΡΠΎ Π·Π° ΡΡΡΡΠ΅Π½Π΅ Π²ΡΠ²Π΅ΠΆΠ΄Π°ΠΌΠ΅ Π΄ΡΠΌΠ°ΡΠ° βEntity Frameworkβ ΠΈ ΠΈΠ·Π±ΠΈΡΠ°ΠΌΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠ° Entity Framework ΠΈ Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅:

Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π²ΡΠ² ΡΠ°ΠΉΠ»Π° App.config, ΡΠ»Π΅Π΄ Π·Π°ΡΠ²Π°ΡΡΡΠΈΡ ΡΠ°Π³ configSections, ΡΡΡΠ±Π²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΈΡ Π±Π»ΠΎΠΊ:
Π connectionString ΡΡΡΠ±Π²Π° Π΄Π° Π²ΡΠ²Π΅Π΄Π΅ΠΌ ΡΡΡΠΈΠ½Π³Π° Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅.
Π‘Π΅Π³Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π² ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ 3 ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°:
- ΠΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° IBaseEntityID
namespace TestLINQ { public interface IBaseEntityID { int ID { get; set; } } } - ΠΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° IBaseEntityName
namespace TestLINQ { public interface IBaseEntityName { string Name { get; set; } } } - ΠΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° 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; }
}
}
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π² ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π½Π°ΡΠΈΡΠ΅ Π΄Π²Π΅ ΡΡΡΠ½ΠΎΡΡΠΈ:
- ΠΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° ΠΊΠ»Π°ΡΠ° Ref
using System.ComponentModel.DataAnnotations.Schema; namespace TestLINQ { [Table("Ref")] public class Ref : BaseEntity { public int ID2 { get; set; } } } - ΠΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° ΠΊΠ»Π°ΡΠ° Customer
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:
ΠΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° ΠΊΠ»Π°ΡΠ° UserContext
using System.Data.Entity;
namespace TestLINQ
{
public class UserContext : DbContext
{
public UserContext()
: base("DbConnection")
{
Database.SetInitializer(null);
}
public DbSet Customer { get; set; }
public DbSet Ref { get; set; }
}
}
ΠΠΎΠ»ΡΡΠΈΡ ΠΌΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΠΏΡΠΎΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΠ΅ΡΡΠΎΠ²Π΅ ΠΏΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Ρ LINQ to SQL ΠΏΡΠ΅Π· EF Π·Π° 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();
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();
}
}
}
}
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ.
Π ΠΊΡΠ°Ρ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²Π΅Π΄Π΅:
ΠΠ΅Π½Π΅ΡΠΈΡΠ°Π½Π° SQL Π·Π°ΡΠ²ΠΊΠ°
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.
Π‘Π΅Π³Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠΌ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΡΠΎ Π Π½Π° ΠΠΠ Π² 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:

, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΠΌ, ΡΠ΅ ΠΈΠ·Π±ΠΎΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΡΠ΅Π· Π΄Π΅ΠΊΠ°ΡΡΠΎΠ²ΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π²Π΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° (ΡΠ°Π±Π»ΠΈΡΠΈ):
ΠΠ΅Π½Π΅ΡΠΈΡΠ°Π½Π° SQL Π·Π°ΡΠ²ΠΊΠ°
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 Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΡΠΎ Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°ΠΌΠΎ ΠΎΠ΄Π½ΠΎ, Π·Π°ΡΠΎΠ²Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Π΅ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ ΡΡΠ΅Π· Π΄Π²Π° Π·Π°ΠΏΠΈΡΠ° ΠΏΠΎ Π²ΡΡΠΊΠΎ ΡΡΠ»ΠΎΠ²ΠΈΠ΅, ΠΏΠΎΡΠ»Π΅Π΄Π²Π°Π½ΠΈ ΠΎΡ ΠΎΠ±Π΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ Union Π·Π° ΠΏΡΠ΅ΠΌΠ°Ρ
Π²Π°Π½Π΅ Π½Π° Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅Π΄ΠΎΠ²Π΅ΡΠ΅.
ΠΠ°, Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡΡΠ° Π² ΠΎΠ±ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ ΡΠ΅ ΠΎΠΊΠ°ΠΆΠ°Ρ Π½Π΅Π΅ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΈ Ρ ΠΎΠ³Π»Π΅Π΄ Π½Π° ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π²ΡΡΠ½Π°ΡΠΈ ΠΏΡΠ»Π½ΠΈ Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΠΈ Π½Π° ΡΠ΅Π΄ΠΎΠ²Π΅ΡΠ΅. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Π² ΡΠ΅Π°Π»Π½ΠΈΡ ΠΆΠΈΠ²ΠΎΡ ΠΏΡΠ»Π½ΠΈΡΠ΅ Π΄ΡΠ±Π»ΠΈΡΠ°ΡΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ Π½Π΅ ΡΠ° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ ΠΈ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π°Ρ Π΄Π° ΡΠ΅ ΠΎΡΡΡΠ²Π°Ρ ΠΎΡ ΡΡΡ
.
Π‘Π΅Π³Π° Π΄Π° ΡΡΠ°Π²Π½ΠΈΠΌ ΠΏΠ»Π°Π½ΠΎΠ²Π΅ΡΠ΅ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅Π·ΠΈ Π΄Π²Π΅ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ:
- Π·Π° CROSS JOIN ΡΡΠ΅Π΄Π½ΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π΅ 195 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ:

- Π·Π° INNER JOIN-UNION ΡΡΠ΅Π΄Π½ΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π΅ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ 24 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ:

ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΎΡ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅, Π·Π° Π΄Π²Π΅ ΡΠ°Π±Π»ΠΈΡΠΈ Ρ ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ Π·Π°ΠΏΠΈΡΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½ΠΎΡΠΎ LINQ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎ-Π±ΡΡΠ·ΠΎ ΠΎΡ Π½Π΅ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½ΠΎΡΠΎ.
ΠΠ° Π²Π°ΡΠΈΠ°Π½ΡΠ° Ρ Π Π² ΡΡΠ»ΠΎΠ²ΠΈΡΡΠ° Π½Π° 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 to 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 };
ΠΊΡΠ΄Π΅ΡΠΎ:
ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π΄Π²Π° ΠΌΠ°ΡΠΈΠ²Π°
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 ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°Ρ ΠΏΠ»Π°Π½ΠΎΠ²Π΅ΡΠ΅ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ Ρ ΡΡΠ»ΠΎΠ²ΠΈΡ ΠΠΠ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com


