我正在编写一个带有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)
是否可以在实体框架中执行此操作?
由于
答案 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();
}