【问题标题】:Entity Framework using SQL Server datastore modelling a one-to-many relationship使用 SQL Server 数据存储建模一对多关系的实体框架
【发布时间】:2019-01-22 17:07:31
【问题描述】:

我可以在诊断以下方面获得帮助吗?

IQueryable<MyComponentsViewModel> vcvm = from v1 in pg.MyComponents 
                                         join item in Items on v1.Item equals item into vc
                                         select new MyComponentsViewModel 
                                                    {  Cost = item.Cost };

出现如下错误:

错误 CS1941:连接子句中的表达式之一的类型是 不正确。调用“GroupJoin”时类型推断失败。

是否因为 item 与 v1.Item 的类型不同而出现此错误状态?

按键如下所示

ALTER TABLE [dbo].[MyComponents]  WITH CHECK ADD  CONSTRAINT 
[FK_MyComponents_Items] FOREIGN KEY([ItemId])
REFERENCES [dbo].[Items] ([Itemid])
GO

ALTER TABLE [dbo].[MyComponents] CHECK CONSTRAINT [FK_MyComponents_Items]

【问题讨论】:

  • 那不是 SQL 相关的问题。
  • 它可能来自依赖关系,因为数据存储是 sql server 并且需要键控。有更好的标签吗?
  • 你试过用谷歌搜索你的错误吗?
  • 是的,它喜欢 stackoverflow 的大多数东西,但我发现一个帖子不相关。你能提供任何有用的反馈吗?
  • 对不起,我是 SQL 人

标签: asp.net entity-framework linq asp.net-core


【解决方案1】:

我假设,您需要内部联接,并且在执行 equals 时,您需要使用其匹配的列 ID 来过滤如下记录

IQueryable<MyComponentsViewModel> vcvm = 
    from myComp in pg.MyComponents 
    join item in Items on myComp.ItemId equals item.Id
    select new MyComponentsViewModel {   Cost = item.Cost };

【讨论】:

  • 谢谢。我认为外键使实体框架能够自动了解关系。
【解决方案2】:

我能够让它工作。

名为 Items 的操作之间存在歧义。完全指定命名空间解决了这个问题。 此外,我必须添加语句“来自 vc.DefaultIfEmpty 中的子项”

我仍在努力学习它的完整语义

IQueryable<MyComponentsViewModel> vcvm = 
    from v1 in pg.MyComponents 
    join item in pg.Items on v1.Item equals item into vc
    from subitem in vc.DefaultIfEmpty()
    select new MyComponentsViewModel {   Cost = subitem.Cost };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 2013-11-24
    • 2020-12-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    相关资源
    最近更新 更多