20 linq-to-entities join outer-join
我试图理解LINQ to Entity中的左外连接.例如,我有以下3个表:
公司,公司产品,产品
CompanyProduct链接到其两个父表,Company和Product.
我想要返回所有公司记录和关联的CompanyProduct,无论CompanyProduct是否存在给定产品.在Transact SQL中,我将使用左外连接从Company表中进行如下操作:
SELECT * FROM Company AS C
LEFT OUTER JOIN CompanyProduct AS CP ON C.CompanyID=CP.CompanyID
LEFT OUTER JOIN Product AS P ON CP.ProductID=P.ProductID
WHERE P.ProductID = 14 OR P.ProductID IS NULL
Run Code Online (Sandbox Code Playgroud)
我的数据库有3个公司,2个CompanyProduct记录与ProductID 14相关联.因此SQL查询的结果是预期的3行,其中2行连接到CompanyProduct和Product,1个只有Company表和null在CompanyProduct和Product表中.
那么如何在LINQ to Entity中编写相同类型的连接来实现类似的结果呢?
我尝试了一些不同的东西,但无法正确的语法.
谢谢.
Kyl*_*ser 16
解决了!
最终产出:
theCompany.id: 1
theProduct.id: 14
theCompany.id: 2
theProduct.id: 14
theCompany.id: 3
Run Code Online (Sandbox Code Playgroud)
这是场景
1 - 数据库
--Company Table
CREATE TABLE [theCompany](
[id] [int] IDENTITY(1,1) NOT NULL,
[value] [nvarchar](50) NULL,
CONSTRAINT [PK_theCompany] 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
--Products Table
CREATE TABLE [theProduct](
[id] [int] IDENTITY(1,1) NOT NULL,
[value] [nvarchar](50) NULL,
CONSTRAINT [PK_theProduct] 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
--CompanyProduct Table
CREATE TABLE [dbo].[CompanyProduct](
[fk_company] [int] NOT NULL,
[fk_product] [int] NOT NULL
) ON [PRIMARY];
GO
ALTER TABLE [CompanyProduct] WITH CHECK ADD CONSTRAINT
[FK_CompanyProduct_theCompany] FOREIGN KEY([fk_company])
REFERENCES [theCompany] ([id]);
GO
ALTER TABLE [dbo].[CompanyProduct] CHECK CONSTRAINT
[FK_CompanyProduct_theCompany];
GO
ALTER TABLE [CompanyProduct] WITH CHECK ADD CONSTRAINT
[FK_CompanyProduct_theProduct] FOREIGN KEY([fk_product])
REFERENCES [dbo].[theProduct] ([id]);
GO
ALTER TABLE [dbo].[CompanyProduct] CHECK CONSTRAINT
[FK_CompanyProduct_theProduct];
Run Code Online (Sandbox Code Playgroud)
2 - 数据
SELECT [id] ,[value] FROM theCompany
id value
----------- --------------------------------------------------
1 company1
2 company2
3 company3
SELECT [id] ,[value] FROM theProduct
id value
----------- --------------------------------------------------
14 Product 1
SELECT [fk_company],[fk_product] FROM CompanyProduct;
fk_company fk_product
----------- -----------
1 14
2 14
Run Code Online (Sandbox Code Playgroud)
3 - VS.NET 2008中的实体
alt text http://i478.photobucket.com/albums/rr148/KyleLanser/companyproduct.png
实体容器名称为'testEntities'(如模型属性窗口中所示)
4 - 守则(最后!)
testEntities entity = new testEntities();
var theResultSet = from c in entity.theCompany
select new { company_id = c.id, product_id = c.theProduct.Select(e=>e) };
foreach(var oneCompany in theResultSet)
{
Debug.WriteLine("theCompany.id: " + oneCompany.company_id);
foreach(var allProducts in oneCompany.product_id)
{
Debug.WriteLine("theProduct.id: " + allProducts.id);
}
}
Run Code Online (Sandbox Code Playgroud)
5 - 最终输出
theCompany.id: 1
theProduct.id: 14
theCompany.id: 2
theProduct.id: 14
theCompany.id: 3
Run Code Online (Sandbox Code Playgroud)
小智 6
它应该是这样的......
var query = from t1 in db.table1
join t2 in db.table2
on t1.Field1 equals t2.field1 into T1andT2
from t2Join in T1andT2.DefaultIfEmpty()
join t3 in db.table3
on t2Join.Field2 equals t3.Field3 into T2andT3
from t3Join in T2andT3.DefaultIfEmpty()
where t1.someField = "Some value"
select
{
t2Join.FieldXXX
t3Join.FieldYYY
};
Run Code Online (Sandbox Code Playgroud)
这就是我做的....
您将需要使用实体框架来设置从公司到产品的多对多映射.这将使用CompanyProduct表,但不必在实体模型中设置CompanyProduct实体.完成后,查询将非常简单,它将取决于个人偏好以及您希望如何表示数据.例如,如果您只想要拥有特定产品的所有公司,您可以说:
var query = from p in Database.ProductSet
where p.ProductId == 14
from c in p.Companies
select c;
Run Code Online (Sandbox Code Playgroud)
要么
var query = Database.CompanySet
.Where(c => c.Products.Any(p => p.ProductId == 14));
Run Code Online (Sandbox Code Playgroud)
您的SQL查询会返回产品信息以及公司.如果这就是你想要的,你可以尝试:
var query = from p in Database.ProductSet
where p.ProductId == 14
select new
{
Product = p,
Companies = p.Companies
};
Run Code Online (Sandbox Code Playgroud)
如果您想提供更多信息,请使用"添加评论"按钮,而不是创建其他答案.
请尝试这样的事情:
from s in db.Employees
join e in db.Employees on s.ReportsTo equals e.EmployeeId
join er in EmployeeRoles on s.EmployeeId equals er.EmployeeId
join r in Roles on er.RoleId equals r.RoleId
where e.EmployeeId == employeeId &&
er.Status == (int)DocumentStatus.Draft
select s;
Run Code Online (Sandbox Code Playgroud)
干杯!
| 归档时间: |
|
| 查看次数: |
53773 次 |
| 最近记录: |