【问题标题】:How to get data in an sql foreign key using asp.net entity framework?如何使用 asp.net 实体框架获取 sql 外键中的数据?
【发布时间】:2017-06-29 12:43:38
【问题描述】:

我现在正在尝试将关系数据库合并到我的项目中。在我的项目中实现 rdbms 之前,通常我可以通过以下代码访问我想要的值:

public static string guitar { get; set; }
public static List<stringInstrumentItem> GetGuitarItems()
{
    List<stringInstrumentItem> list2 = new List<stringInstrumentItem>();

        MusicStoreDBEntities obj2 = new MusicStoreDBEntities();
        list2 = (from g in obj2.stringInstrumentItems where g.brand == guitar select g).ToList();


    return list2;

}

但是现在我已经在我的 sql 脚本中设置了一个外键,g.brand 不起作用,因为它不再包含文本值,它现在是一个名为 brandId 的 int。为了更好地理解我的问题,这里是 stringInstrumentItem 表的 sql 脚本。这是我设置外键brandId 引用品牌表及其主键的地方。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[stringInstrumentItem](
[itemId] [int] NOT NULL,
[type] [varchar](50) NOT NULL,
[brandId] [int] FOREIGN KEY REFERENCES brand(brandId),
[model] [varchar](50) NOT NULL,
[price] [float] NOT NULL,
[itemimage1] [varchar](255) NULL,
[itemimage2] [varchar](255) NULL,
[description] [text] NOT NULL,
[necktype] [varchar](100) NOT NULL,
[body] [varchar](100) NOT NULL,
[fretboard] [varchar](100) NOT NULL,
[fret] [varchar](50) NOT NULL,
[bridge] [varchar](100) NOT NULL,
[neckpickup] [varchar](100) NOT NULL,
[bridgepickup] [varchar](100) NOT NULL,
[hardwarecolor] [varchar](50) NOT NULL,
PRIMARY KEY CLUSTERED 
(
[itemId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = 
OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO

现在是品牌表。这是 stringInstrumentItem 所指的表。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[brand](
[brandId] [int] NOT NULL,
[type] [varchar](50) NOT NULL,
[name] [varchar](50) NOT NULL,
[image] [varchar](255) NULL,
PRIMARY KEY CLUSTERED 
(
[brandId] 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
SET ANSI_PADDING OFF 
GO

我的目标是能够使用 asp.net 和实体框架通过 stringInstrumentItem 表访问品牌表中名为 name 的字段的值。我还没有真正找到答案。我希望你们能帮助我解决这个问题。

【问题讨论】:

  • 最简单的方法是分两步完成。先获取 id,然后找到具有该 id 的对象。

标签: c# asp.net sql-server foreign-keys relational-database


【解决方案1】:

如果您在 MusicStoreDBEntities 中这两者之间有适当的关系,您应该能够访问像 g.brand.name 这样的品牌名称。

list2 = (from g in obj2.stringInstrumentItems 
        where g.brand.name == guitar select g).ToList();
                     ^^^^^^

否则,您将不得不像这样手动加入它们 -

list2 = (from g in obj2.stringInstrumentItems
        join b in obj2.brand
        on g.brandId equals b.brandId
        where b.name == guitar
        select g).ToList();

【讨论】:

  • 以这种格式“SELECT COUNT(*) FROM stringInstrumentItem WHERE brandId LIKE @brand”怎么样?我将如何通过stringInstrumentItem以这种格式获取品牌表中名为name的字段???
  • 您可以使用.Count() 代替.ToList()。 Count 返回整数值。
  • 是的,但我并不是说要使用实体框架 linq。我的意思是如何在这样的常规 sql 脚本中执行此操作:“SELECT COUNT(*) FROM stringInstrumentItem WHERE brandId LIKE @brand”。对于我的问题缺乏解释,我深表歉意。
  • 您能创建一个新问题吗?我很高兴看到它。
  • 请在这里查看我的新问题:stackoverflow.com/questions/44828553/…
【解决方案2】:

试试这个:

    list2 = MusicStoreDBEntities.stringInstrumentItem. 
Where(x=> x.brand.name == "guitar").Select(x=> x).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    相关资源
    最近更新 更多