![](/img/trans.png)
[英]Multiplicity of relationship changes in Entity Framework 6 from 1-to-many to 1-to-0 or 0..1
[英]Left join in Entity Framework with 1-to-many relation
我有五个表:
Coupons
Coupon_Redemptions
User_Coupon
Wash
Account
这是在SQL Server
和Entity Raw SQL
中工作的SQL Query
,但无法使其与LINQ
因为1-to-many
关系,延迟加载无法获得它,因为 User_coupons、Wash...集合。
SELECT
C.Id AS "CouponId", C.Coupon_code AS "CouponCode",
C.Discount_amount AS "DiscountAmount",
C.Valid_for_all AS "ValidForAll", C.Expiration_date AS "ExpirationDate",
R.Redemption_date AS "RedemptionDate",
U.Date_added AS "DateAddedToUser", W.Id AS "WashId", A.Name
FROM
Coupon C
LEFT JOIN User_coupon U on U.CouponId = C.Id
LEFT JOIN Coupon_redemption R on R.CouponId = C.Id
LEFT JOIN Wash W on W.CouponId = C.Id
LEFT JOIN Account A on U.AccountId = A.Id
尝试对此查询进行变体,它返回一行。 但它看起来很完美。
var results =
from c in db.Coupons
from u in c.User_coupon.DefaultIfEmpty()
from r in c.Coupon_redemption.DefaultIfEmpty()
from w in c.Washes.DefaultIfEmpty()
select new {
CouponId = c.Id,
CouponCode = c.Coupon_code,
DiscountAmount = c.Discount_amount,
ValidForAll = c.Valid_for_all,
ExpirationDate = c.Expiration_date,
RedemptionDate = r.Redemption_date,
DateAddedToUser = u.Date_added,
WashId = w.Id
};
结果到字符串:
SELECT[Extent1].[Id] AS [Id], [Extent1].[Coupon_code] AS [Coupon_code], [Extent1].[Discount_amount] AS [Discount_amount], [Extent1].[Valid_for_all] AS [Valid_for_all], [Extent1].[Expiration_date] AS [Expiration_date], [Extent3].[Redemption_date] AS [Redemption_date], [Extent2].[Date_added] AS [Date_added], [Extent4].[Id] AS [Id1]
FROM [dbo].[Coupon] AS [Extent1]
LEFT OUTER JOIN [dbo].[User_coupon] AS [Extent2] ON [Extent1].[Id] = [Extent2].[CouponId]
LEFT OUTER JOIN [dbo].[Coupon_redemption] AS [Extent3] ON [Extent1].[Id] = [Extent3].[CouponId]
LEFT OUTER JOIN [dbo].[Wash] AS [Extent4] ON [Extent1].[Id] = [Extent4].[CouponId]
好吧,当包含它们的对象被具体化(即您通过对象实例工作)时,它们是集合(有或没有延迟加载)。 在 LINQ to Entities 查询中使用时,它们是简单的表导航(连接)。
规则很简单。 要获得集合导航属性的等效 SQL 内连接,您可以使用
from child in parent.Collection
和分别对于左外连接:
from child in parent.Collection.DefaultIfEmpty()
对于参考导航属性,您不能明确指定连接的类型 - 它取决于(受控制)关系是必需的还是可选的。 而不是from
,您可以使用let
或直接使用导航属性来获取等效的 SQL 查询连接。
话虽如此,等效的 LINQ 查询将是这样的:
var query =
from c in dbContext.Coupons
from u in c.User_coupon.DefaultIfEmpty()
from r in c.Coupon_redemptions.DefaultIfEmpty()
from w in c.Washes.DefaultIfEmpty()
let a = u.Account
select new
{
CouponId = c.Id,
CouponCode = c.Coupon_code,
DiscountAmount = c.Discount_amount,
ValidForAll = c.Valid_for_all,
ExpirationDate = c.Expiration_date,
RedemptionDate = r.Redemption_date,
DateAddedToUser = u.Date_added,
WashId = w.Id,
Name = a.Name,
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.