当看到这个异常时,一脸茫然,我的Linq语句里并没有使用这个“Discriminator”字段。然后看了看生成的sql语句,我去,居然出现了“Discriminator”这个字段。
ON ([Extent4].[Discriminator] IN (N'YKSIPProductResponseVModel',N'YKSIPGoodsMapping'))
百度了一下:
异常的原因:我的EF使用了code first模式,YKSIPGoodsMapping表和数据库表YKSIPGoodsMapping对应,但是我后面又定义了一个类YKSIPProductResponseVModel,并且继承类YKSIPGoodsMapping,而类YKSIPProductResponseVModel并没有和数据库表存在映射关系,于是导致了EF无法识别子类,就出现了这个异常。
解决方法:给和数据库没有映射关系的子类加上属性 [NotMapped] 就可以了。
public class YKSIPProductResponseVModel : YKSIPGoodsMapping
{
}
Sql语句:
SELECT [Filter1].[ChannelLinkId1] AS [ChannelLinkId], [Filter1].[OuterTitle] AS [OuterTitle],
[Filter1].[ProductPackageId1] AS [ProductPackageId], [Filter1].[PackageName] AS [PackageName],
CASE WHEN ([Extent4].[GoodsMappingId] IS NULL) THEN -1 ELSE [Extent4].[PushData] END AS [C1],
CASE WHEN ([Extent4].[GoodsMappingId] IS NULL) THEN -1 ELSE [Extent4].[GoodsStatus] END AS [C2],
CASE WHEN ([Extent4].[GoodsMappingId] IS NULL) THEN N'' ELSE [Extent4].[PartnerGoodsId] END AS [C3],
CASE WHEN ([Extent4].[GoodsMappingId] IS NULL) THEN N'' ELSE [Extent4].[ModifiedByName] END AS [C4],
CASE WHEN ([Extent4].[GoodsMappingId] IS NULL) THEN CAST(NULL AS datetime2) ELSE [Extent4].[ModifiedDate] END AS [C5]
FROM (SELECT [Extent1].[ChannelLinkId] AS [ChannelLinkId2], [Extent2].[ChannelLinkId]
AS [ChannelLinkId1], [Extent2].[ChannelId] AS [ChannelId], [Extent2].[OuterTitle]
AS [OuterTitle], [Extent3].[ProductPackageId] AS [ProductPackageId1], [Extent3].[PackageName] AS [PackageName]
FROM [dbo].[ChannelPackageMapping] AS [Extent1]
INNER JOIN [dbo].[ChannelLink] AS [Extent2] ON [Extent1].[ChannelLinkId] = [Extent2].[ChannelLinkId]
INNER JOIN [dbo].[ProductPackage] AS [Extent3] ON [Extent1].[ProductPackageId] = [Extent3].[ProductPackageId]
WHERE 0 = [Extent1].[IsDelete] ) AS [Filter1] LEFT OUTER JOIN [dbo].[YKSIPGoodsMapping] AS [Extent4]
ON ([Extent4].[Discriminator] IN (N'YKSIPProductResponseVModel',N'YKSIPGoodsMapping'))
AND ([Filter1].[ChannelLinkId2] = [Extent4].[ChannelLinkId])
WHERE ([Filter1].[ChannelId] = @p__linq__0) AND (@p__linq__1 IS NULL OR [Filter1].[ProductPackageId1] = @p__linq__2) AND ((@p__linq__3 IS NULL) OR (( CAST(LEN(@p__linq__3) AS int)) = 0)
OR ([Filter1].[PackageName] = @p__linq__4)
OR (([Filter1].[PackageName] IS NULL) AND (@p__linq__4 IS NULL))) AND ((@p__linq__5 IS NULL) OR ([Extent4].[AccountsId] = @p__linq__6)
OR (([Extent4].[AccountsId] IS NULL) AND (@p__linq__6 IS NULL))) AND ((@p__linq__7 IS NULL) OR (( CAST(LEN(@p__linq__7) AS int)) = 0)
OR (@p__linq__8 = [Extent4].[PartnerGoodsId]) OR ((@p__linq__8 IS NULL) AND ([Extent4].[PartnerGoodsId] IS NULL))) AND ((@p__linq__9 IS NULL)
OR (@p__linq__10 = [Extent4].[PushData]) OR ((@p__linq__10 IS NULL) AND ([Extent4].[PushData] IS NULL))) AND ((@p__linq__11 IS NULL)
OR (@p__linq__12 = [Extent4].[GoodsStatus]) OR ((@p__linq__12 IS NULL) AND ([Extent4].[GoodsStatus] IS NULL)))
Linq语句:
var query = from cpm in ChannelPackageMappingRepository.Entities
join cl in ChannelLinkRepository.Entities on cpm.ChannelLinkId equals cl.ChannelLinkId
join pp in ProductPackageRepository.Entities on cpm.ProductPackageId equals pp.ProductPackageId
join yksipgm in YkSipGoodsMappingRepository.Entities
on cpm.ChannelLinkId equals yksipgm.ChannelLinkId into cpmYksip //left join
from temp in cpmYksip.DefaultIfEmpty()
where cpm.IsDelete == false && cl.ChannelId == channelType
&& (param.productId == null || pp.ProductPackageId == param.productId)
&& (string.IsNullOrEmpty(param.productName) || pp.PackageName == param.productName)
&& (param.accountId == null || temp.AccountsId == param.accountId)
&& (string.IsNullOrEmpty(param.partnerGoodsId) || param.partnerGoodsId == temp.PartnerGoodsId)
&& (param.pushData == null || param.pushData == temp.PushData)
&& (param.GoodsStatus == null || param.GoodsStatus == temp.GoodsStatus)
select new
{
cl.ChannelLinkId,
cl.OuterTitle,
pp.ProductPackageId,
pp.PackageName,
PushData = temp == null ? -1 : temp.PushData,
GoodsStatus = temp == null ? -1 : temp.GoodsStatus,
PartnerGoodsId = temp == null ? "" : temp.PartnerGoodsId,
ModifiedByName = temp == null ? "" : temp.ModifiedByName,
ModifiedDate = temp == null ? null : temp.ModifiedDate
};