我试图理解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
我的数据库有3个公司,2个CompanyProduct记录与ProductID 14相关联.因此SQL查询的结果是预期的3行,其中2行连接到CompanyProduct和Product,1个只有Company表和null在CompanyProduct和Product表中.
那么如何在LINQ to Entity中编写相同类型的连接来实现类似的结果呢?
我尝试了一些不同的东西,但无法正确的语法.
谢谢.
解决了!
最终产出:
theCompany.id: 1 theProduct.id: 14 theCompany.id: 2 theProduct.id: 14 theCompany.id: 3
这是场景
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];
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
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);
}
}
5 - 最终输出
theCompany.id: 1 theProduct.id: 14 theCompany.id: 2 theProduct.id: 14 theCompany.id: 3
它应该是这样的......
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 };
这就是我做的....
您将需要使用实体框架来设置从公司到产品的多对多映射.这将使用CompanyProduct表,但不必在实体模型中设置CompanyProduct实体.完成后,查询将非常简单,它将取决于个人偏好以及您希望如何表示数据.例如,如果您只想要拥有特定产品的所有公司,您可以说:
var query = from p in Database.ProductSet where p.ProductId == 14 from c in p.Companies select c;
要么
var query = Database.CompanySet .Where(c => c.Products.Any(p => p.ProductId == 14));
您的SQL查询会返回产品信息以及公司.如果这就是你想要的,你可以尝试:
var query = from p in Database.ProductSet where p.ProductId == 14 select new { Product = p, Companies = p.Companies };
如果您想提供更多信息,请使用"添加评论"按钮,而不是创建其他答案.