LINQ เชเช เชถเชเซเชคเชฟเชถเชพเชณเซ เชจเชตเซ เชกเซเชเชพ เชฎเซเชจเซเชชเซเชฏเซเชฒเซเชถเชจ เชฒเซเชเชเซเชตเซเช เชคเชฐเซเชเซ .NET เชฆเชพเชเชฒ เชเชฐเซเชฏเซเช. เชคเซเชจเชพ เชญเชพเช เชฐเซเชชเซ LINQ เชฅเซ SQL เชคเชฎเชจเซ DBMS เชธเชพเชฅเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเชจเซเชเชฟเชเซ เชซเซเชฐเซเชฎเชตเชฐเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเซเชฌ เช
เชจเซเชเซเชณ เชฐเซเชคเซ เชตเชพเชคเชเซเชค เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ. เชเซ เชเซ, เชเชฃเซ เชตเชพเชฐ เชคเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ, เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช เช เชเซเชตเชพเชจเซเช เชญเซเชฒเซ เชเชพเชฏ เชเซ เชเซ เชคเชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช เชเชจเซเชเชฟเชเซ เชซเซเชฐเซเชฎเชตเชฐเซเช, เชเซเชตเซเชฐเซ เชเชฐเชตเชพ เชฏเซเชเซเชฏ เชชเซเชฐเชฆเชพเชคเชพ เชเซเชตเชพ เชชเซเชฐเชเชพเชฐเชจเซ SQL เชเซเชตเซเชฐเซ เชเชจเชฐเซเช เชเชฐเชถเซ.
เชเชพเชฒเซ เชเชฆเชพเชนเชฐเชฃเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชฌเซ เชฎเซเชเซเชฏ เชฎเซเชฆเซเชฆเชพเช เชเซเชเช.
เช เชเชฐเชตเชพ เชฎเชพเชเซ, 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# เชเชจเซเชธเซเชฒ เชเชช (.NET เชซเซเชฐเซเชฎเชตเชฐเซเช) เชชเซเชฐเซเชเซเชเซเช เชฌเชจเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ:
เชเชเชณ, เชคเชฎเชพเชฐเซ เชกเซเชเชพเชฌเซเช เชธเชพเชฅเซ เชเซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชจเซเชเชฟเชเซ เชซเซเชฐเซเชฎเชตเชฐเซเช เชฎเชพเชเซ เชฒเชพเชเชฌเซเชฐเซเชฐเซ เชเชฎเซเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
เชคเซเชจเซ เชเชฎเซเชฐเชตเชพ เชฎเชพเชเซ, เชชเซเชฐเซเชเซเชเซเช เชชเชฐ เชเชฎเชฃเซเช-เชเซเชฒเชฟเช เชเชฐเซ เช
เชจเซ เชธเชเชฆเชฐเซเชญ เชฎเซเชจเซเชฎเชพเชเชฅเซ NuGet Packages เชฎเซเชจเซเช เชเชฐเซ เชชเชธเชเชฆ เชเชฐเซ:
เชชเชเซ, เชฆเซเชเชพเชคเซ NuGet เชชเซเชเซเช เชฎเซเชจเซเชเชฎเซเชจเซเช เชตเชฟเชจเซเชกเซเชฎเชพเช, เชธเชฐเซเช เชตเชฟเชจเซเชกเซเชฎเชพเช "เชเชจเซเชเชฟเชเซ เชซเซเชฐเซเชฎเชตเชฐเซเช" เชถเชฌเซเชฆ เชฆเชพเชเชฒ เชเชฐเซ เช
เชจเซ เชเชจเซเชเชฟเชเซ เชซเซเชฐเซเชฎเชตเชฐเซเช เชชเซเชเซเช เชชเชธเชเชฆ เชเชฐเซ เช
เชจเซ เชคเซเชจเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ:
เชเชเชณ, App.config เชซเชพเชเชฒเชฎเชพเช, configSections เชคเชคเซเชต เชฌเชเชง เชเชฐเซเชฏเชพ เชชเชเซ, เชคเชฎเชพเชฐเซ เชจเซเชเซเชจเซ เชฌเซเชฒเซเช เชเชฎเซเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ:
<connectionStrings>
<add name="DBConnection" connectionString="data source=ะะะฏ_ะญะะะะะะะฏะ ะ_MSSQL;Initial Catalog=TEST;Integrated Security=True;" providerName="System.Data.SqlClient" />
</connectionStrings>
เชเชจเซเชเซเชถเชจเชธเซเชเซเชฐเชฟเชเชเชฎเชพเช เชคเชฎเชพเชฐเซ เชเชจเซเชเซเชถเชจ เชธเซเชเซเชฐเชฟเชเช เชฆเชพเชเชฒ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
เชนเชตเซ เชเชพเชฒเซ เช เชฒเช เชซเชพเชเชฒเซเชฎเชพเช 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; }
}
}
เช เชฎเชจเซ MS SQL เชธเชฐเซเชตเชฐ เชฎเชพเชเซ EF เชฆเซเชตเชพเชฐเชพ LINQ เชฅเซ SQL เชธเชพเชฅเซ เชเชชเซเชเชฟเชฎเชพเชเชเซเชถเชจ เชชเชฐเซเชเซเชทเชฃเซ เชเชฐเชตเชพ เชฎเชพเชเซ เชคเซเชฏเชพเชฐ เชเชเซเชฒ เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซ เชเซ:
เชนเชตเซ 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 เชเซเชตเซเชฐเซ เช MS SQL เชธเชฐเซเชตเชฐ DBMS เชฎเชพเชเซ เชเซเชฌ เชธเชพเชฐเซ เชฐเซเชคเซ SQL เชเซเชตเซเชฐเซ เชเชจเชฐเซเช เชเชฐเซ เชเซ.
เชนเชตเซ เชเชพเชฒเซ LINQ เชเซเชตเซเชฐเซ เชฎเชพเช AND เชถเชฐเชคเชจเซ OR เชฎเชพเช เชฌเชฆเชฒเซเช:
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 เชเซเชตเซเชฐเซเชเชฎเชพเช เชซเชเซเชค เชเช เช เชเซเชกเชตเชพเชจเซ เชถเชฐเชค เชนเซเช เชถเชเซ เชเซ, เชคเซเชฅเซ เช
เชนเซเช เชฆเชฐเซเช เชถเชฐเชค เชฎเชพเชเซ เชฌเซ เชเซเชตเซเชฐเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เช
เชจเซ เชชเชเซ เชชเชเชเซเชคเชฟเชเชฎเชพเชเชฅเซ เชกเซเชชเซเชฒเชฟเชเซเชเซเชธ เชฆเซเชฐ เชเชฐเชตเชพ เชฎเชพเชเซ เชฏเซเชจเชฟเชฏเชจ เชฆเซเชตเชพเชฐเชพ เชคเซเชฎเชจเซ เชเซเชกเซเชจเซ เชธเชฎเชเชเซเชท เชเซเชตเซเชฐเซ เชเชฐเชตเซ เชถเชเซเชฏ เชเซ.
เชนเชพ, เชเซเชตเซเชฐเซ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชฌเชฟเชจ-เชธเชฎเชพเชจ เชนเชถเซ, เชคเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฒเซเชคเชพ เชเซ เชธเชเชชเซเชฐเซเชฃ เชกเซเชชเซเชฒเชฟเชเซเช เชชเชเชเซเชคเชฟเช เชชเชฐเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชถเชเซ เชเซ. เชเซ เชเซ, เชตเชพเชธเซเชคเชตเชฟเช เชเซเชตเชจเชฎเชพเช, เชธเชเชชเซเชฐเซเชฃ เชกเซเชชเซเชฒเชฟเชเซเช เชฒเชพเชเชจเชจเซ เชเชฐเซเชฐ เชจเชฅเซ เช
เชจเซ เชฒเซเชเซ เชคเซเชฎเชพเชเชฅเซ เชเซเชเชเชพเชฐเซ เชฎเซเชณเชตเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซ เชเซ.
เชนเชตเซ เชเชพเชฒเซ เช เชฌเซ เชชเซเชฐเชถเซเชจเซเชจเชพ เช เชฎเชฒเซเชเชฐเชฃ เชฏเซเชเชจเชพเชเชจเซ เชคเซเชฒเชจเชพ เชเชฐเซเช:
- 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, ะฐ ัะฐะบะถะต ะฝะฐะฟะพะปะฝะตะฝะธะต ะดะฐะฝะฝัะผะธ ััะธั
ัะฐะฑะปะธั ะฝะฐั
ะพะดะธััั
เช เชฐเซเชชเซเชเซเชเชฐเซเชฎเชพเช, เชชเซเชฒเชพเชจ เชซเซเชฒเซเชกเชฐเชฎเชพเช, OR เชถเชฐเชคเซ เชธเชพเชฅเซ เชเซเชตเซเชฐเซ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซเชจเซ เชฏเซเชเชจเชพเช เชเซ.
เชธเซเชฐเซเชธ: www.habr.com