LINQ Π½Π°Π²Π»Π΅Π·Π΅ Π² .NET ΠΊΠ°ΡΠΎ ΠΌΠΎΡΠ΅Π½ Π½ΠΎΠ² Π΅Π·ΠΈΠΊ Π·Π° ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ. LINQ to SQL ΠΊΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ Π½Π΅Π³ΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠΈΡΠ°ΡΠ΅ ΡΡΡ Π‘Π£ΠΠ Π΄ΠΎΡΡΠ° ΡΠ΄ΠΎΠ±Π½ΠΎ, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Entity Framework. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π³ΠΎ Π΄ΠΎΡΡΠ° ΡΠ΅ΡΡΠΎ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π·Π°Π±ΡΠ°Π²ΡΡ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°Ρ ΠΊΠ°ΠΊΡΠ² Π²ΠΈΠ΄ SQL Π·Π°ΡΠ²ΠΊΠ° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊΡΡ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈ Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅, Π²ΡΠ² Π²Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ, 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, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡ:
ΠΠΎΠΏΡΠ»Π²Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π Π΅Ρ
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 ΠΏΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡ:
ΠΠΎΠΏΡΠ»Π²Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΠ»ΠΈΠ΅Π½Ρ
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# (.NET Framework):
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π° Entity Framework, Π·Π° Π΄Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π° Ρ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ.
ΠΠ° Π΄Π° Π³ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅, ΡΡΠ°ΠΊΠ½Π΅ΡΠ΅ Ρ Π΄Π΅ΡΠ½ΠΈΡ Π±ΡΡΠΎΠ½ Π²ΡΡΡ
Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ NuGet ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΠΎΡΠΎ ΠΌΠ΅Π½Ρ:
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π² ΠΏΡΠΎΠ·ΠΎΡΠ΅ΡΠ° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ NuGet, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π²Π°, Π² ΠΏΠΎΠ»Π΅ΡΠΎ Π·Π° ΡΡΡΡΠ΅Π½Π΅ Π²ΡΠ²Π΅Π΄Π΅ΡΠ΅ Π΄ΡΠΌΠ°ΡΠ° βEntity Frameworkβ ΠΈ ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠ° Entity Framework ΠΈ Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅:
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π²ΡΠ² ΡΠ°ΠΉΠ»Π° App.config, ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ Π·Π°ΡΠ²ΠΎΡΠΈΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ° configSections, Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ Π±Π»ΠΎΠΊ:
<connectionStrings>
<add name="DBConnection" connectionString="data source=ΠΠΠ―_ΠΠΠΠΠΠΠΠ―Π Π_MSSQL;Initial Catalog=TEST;Integrated Security=True;" providerName="System.Data.SqlClient" />
</connectionStrings>
Π 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; }
}
}
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π² ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π½Π°ΡΠΈΡΠ΅ Π΄Π²Π° ΠΎΠ±Π΅ΠΊΡΠ°:
- Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ΅Π½ ΠΊΠ»Π°Ρ
using System.ComponentModel.DataAnnotations.Schema; namespace TestLINQ { [Table("Ref")] public class Ref : BaseEntity { public int ID2 { get; set; } } }
- Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΊΠ»Π°Ρ ΠΠ»ΠΈΠ΅Π½Ρ
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 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<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();
}
}
}
}
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π½Π΅ΠΊΠ° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ.
Π ΠΊΡΠ°Ρ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° ΡΠ΅ ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
ΠΠ΅Π½Π΅ΡΠΈΡΠ°Π½Π° 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 Π·Π°ΡΠ²ΠΊΠ° (ΠΏΡΡΠ²Π° ΠΎΠΏΡΠΈΡ)
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 Π·Π°ΡΠ²ΠΊΠ° (ΠΏΡΡΠ²Π° ΠΎΠΏΡΠΈΡ)
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 Π΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ ΠΊΠ°ΠΊΡΠΎ ΡΠ»Π΅Π΄Π²Π°:
ΠΠ΅ΡΠΈΠ½ΠΈΡΠΈΡ Π½Π° ΠΏΠ°ΡΠ° ΡΠΈΠΏ
class Para
{
public int Key1, Key2;
public string Data;
}
ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΡΠ°Π·Π³Π»Π΅Π΄Π°Ρ ΠΌΠ΅ Π½ΡΠΊΠΎΠΈ Π°ΡΠΏΠ΅ΠΊΡΠΈ ΠΏΡΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° LINQ Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ MS SQL Server.
ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΡΠΈ ΠΎΠΏΠΈΡΠ½ΠΈ ΠΈ Π²ΠΎΠ΄Π΅ΡΠΈ .NET ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π·Π°Π±ΡΠ°Π²ΡΡ, ΡΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ°Ρ ΠΊΠ°ΠΊΠ²ΠΎ ΠΏΡΠ°Π²ΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π°Π΄ ΠΊΡΠ»ΠΈΡΠΈΡΠ΅. Π ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ ΡΡΠ°Π²Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΎΡΠΈ ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΡΡ Π±ΠΎΠΌΠ±Π° ΡΡΡ Π·Π°ΠΊΡΡΠ½ΠΈΡΠ΅Π» Π² Π±ΡΠ΄Π΅ΡΠ΅, ΠΊΠ°ΠΊΡΠΎ ΠΏΡΠΈ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΎΡΡΡΠ΅ΡΠ½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΡΠ°ΠΊΠ° ΠΈ ΠΏΡΠΈ Π½Π΅Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π²ΡΠ² Π²ΡΠ½ΡΠ½ΠΈΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ Π½Π° ΠΎΠΊΠΎΠ»Π½Π°ΡΠ° ΡΡΠ΅Π΄Π°.
ΠΠΌΠ°ΡΠ΅ ΠΈ ΠΌΠ°Π»ΡΠΊ ΠΏΡΠ΅Π³Π»Π΅Π΄
ΠΠ·ΡΠΎΡΠ½ΠΈΡΠΈ Π·Π° ΡΠ΅ΡΡΠ° - ΡΠ°ΠΌΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡ, ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ TEST, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅Π·ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ Ρ Π΄Π°Π½Π½ΠΈ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π² ΡΠΎΠ²Π° Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° ΠΠ»Π°Π½ΠΎΠ²Π΅ ΠΈΠΌΠ° ΠΏΠ»Π°Π½ΠΎΠ²Π΅ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ Ρ ΠΠΠ ΡΡΠ»ΠΎΠ²ΠΈΡ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com