【问题标题】:MVC Entity Framework Select field from other entity when is null当为空时,MVC 实体框架从其他实体中选择字段
【发布时间】:2017-05-04 19:03:07
【问题描述】:

我正在编写一个带有实体框架应用程序的 ASP.NET MVC。我正在将存储过程迁移到 lambda 表达式。

我有两张表,其中一张是Configuration 表,我有默认值。

我正在执行select from table1,如果列为空,我会从 table2 中获取默认值。

在 SQL Server 中,我有这个:

Select 
    field1, field2, field3,
    isnull(field4, (select fieldXX from Table2 with (nolock))) as field4
from 
    Table1 with (nolock)

在实体框架中可以做到吗?

谢谢

【问题讨论】:

  • 您投票的答案无效。请查看其他答案。您能否让我知道这是否有效,并告诉我您是否希望我确认答案。
  • 我在下面更新了我的答案,以便它包含一个选择。我并不是说 Ashiquzzaman 没有解决它,但我只是无法让他/她的解决方案发挥作用。
  • 您可以将其作为联接而不是子查询来执行吗?

标签: asp.net-mvc entity-framework lambda


【解决方案1】:

试试这个:

var result= from p in Table1
         select new 
         {
           field1= p.field1,
           field2= p.field2,
           field3= p.field3,
           field4= p.field4==null?(from c in Table2 select c.fieldXX).FirstOrDefault():p.field4
         }.ToList();

【讨论】:

  • 这得到一个操作符??不能应用于 string 和 system.linq.Iqueryable 类型的操作数
  • 它工作正常,但我误以为 field4 是 byte[] 类型,并且不允许使用 ??对于字节类型...我该怎么做?谢谢
  • @Diego 对我之前的回答感到抱歉。我只是想念FirstOrDefault。我更新我的答案。请立即尝试。
【解决方案2】:

首先添加表格和数据:

--I use db Breaz, you use whatever you require
USE [Breaz]
GO
/****** Object:  Table [dbo].[table1]    Script Date: 5/4/2017 12:20:45 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[table1](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [field1] [varchar](10) NULL,
    [field2] [varchar](10) NULL,
    [field3] [varchar](10) NULL,
    [field4] [varchar](10) NULL,
 CONSTRAINT [PK_table1] 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
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[table2]    Script Date: 5/4/2017 12:20:45 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[table2](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Field4Default] [varchar](10) NULL,
 CONSTRAINT [PK_table2] 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
SET ANSI_PADDING OFF
GO
SET IDENTITY_INSERT [dbo].[table1] ON 

GO
INSERT [dbo].[table1] ([Id], [field1], [field2], [field3], [field4]) VALUES (1, N'f1', N'f2', N'f3', N'f4')
GO
INSERT [dbo].[table1] ([Id], [field1], [field2], [field3], [field4]) VALUES (2, N'seconda', N'secondb', N'secondc', NULL)
GO
SET IDENTITY_INSERT [dbo].[table1] OFF
GO
SET IDENTITY_INSERT [dbo].[table2] ON 

GO
INSERT [dbo].[table2] ([Id], [Field4Default]) VALUES (3, N'DefaultV')
GO
SET IDENTITY_INSERT [dbo].[table2] OFF
GO

添加 EDMX:右键单击 Models 文件夹并添加 ADO.NET 实体数据模型。将其命名为 table1 并单击 Ok,Generate from database 突出显示,因此单击 Next。单击新建连接。输入服务器名称。使用 windows 身份验证或使用 sql server 身份验证(凭据),如果是后者,请单击保存我的密码。从下拉列表中选择数据库。单击确定。如果您进行了 Windows 身份验证,请等待单击“是,包括敏感信息..”。将“保存实体连接...”下方的连接复制到剪贴板。点击下一步。在表下,选择表 1 和表 2。点击完成。然后点击 ok 出现接下来的两个提示(等待它们),然后关闭 gui 设计器。

这是你的控制器。

public class HomeController : Controller
{
    public ActionResult Index63()
    {
        var table1List = new List<table1>();
        //instead of BreazEntities18,  use the name you copied to the clipboard
        //or lick on table1.context.cs to get the name
        using (BreazEntities18 entity = new BreazEntities18())
        {
            var q = entity.table1.Select(r => new
            {
                field1 = r.field1,
                field2 = r.field2,
                field3 = r.field3,
                field4 = r.field4 == null ? (entity.table2.Select(s => s.Field4Default).FirstOrDefault())
                                : r.field4
            }
                ).ToList();
        }

        return View();
    }

【讨论】:

  • 我做过这样的事情,我假装做的事情是在单个 Select 中完成。谢谢
  • @Diego 我在下面更新了我的答案,以便它包含一个选择。我并不是说 Ashiquzzaman 没有解决它,但我只是无法让他/她的解决方案发挥作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多