当null为

时间:2017-05-04 19:03:08

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

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

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

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

在SQL Server中,我有这个:

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

是否可以在实体框架中执行此操作?

由于

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

首先添加表格和数据:

--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并单击“确定”,突出显示“从数据库生成”,然后单击“下一步”。单击“新连接”。输入服务器名称。使用Windows身份验证或使用sql server身份验证(凭据),如果是后者,请单击“保存我的密码”。从下拉列表中选择数据库。单击确定。如果您进行了Windows身份验证,请等待“是,包含敏感...”。将“保存实体连接...”下面的连接复制到剪贴板。点击下一步。在表下,选择table1和table2。点击完成。然后在接下来的两个提示中单击“确定”(等待它们),然后关闭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();
    }