2017-05-04 72 views
1

我正在使用实体框架应用程序编写ASP.NET MVC。我正在将存储过程迁移到lambda表达式。MVC实体框架当为空时从其他实体中选择字段

我有两个表,其中之一是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) 

是否有可能做到这一点在实体框架?

感谢

+0

您投了票的答案不起作用。请参阅其他答案。你能否告诉我,如果这个方法有效,并告诉我你是否希望我把答案弄清楚。 – kblau

+0

我在下面更新了我的答案,以便它包含一个选择。我并不是说Ashiquzzaman没有解决问题,但我无法让他/她的解决方案工作。 – kblau

+0

你可以做一个连接而不是子查询吗? – Jasen

回答

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(); 
+0

这会得到一个操作符?不能应用于字符串类型和system.linq.Iqueryable的操作数 kblau

+0

它工作正常,但我想说field4是一个byte []类型,它不允许使用?对于字节类型...我该怎么做?谢谢 – Diego

+0

@Diego对不起,我以前的答案。我只是想念'FirstOrDefault'。我更新我的答案。请现在试试这个。 – Ashiquzzaman

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服务器身份验证(凭据),如果后者,请单击保存我的密码。从下拉菜单中选择数据库。点击确定。等待点击'是的,包括敏感..',如果你没有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(); 
    } 
+0

我已经这样做了,我假装要做的是在一个Select中做。谢谢 – Diego

+0

@Diego我在下面更新了我的答案,以便它包含一个选择。我并不是说Ashiquzzaman没有解决问题,但我无法让他/她的解决方案工作。 – kblau