2017-07-31 63 views
0

一直在试图弄清楚我的查询出了什么问题,并且一直在玩Where条件的一轮,但没有运气。以下是我在控制器文件中的查询。Linq在条件无法正常工作的情况下,使用EF

ValueStory valuestory = await db.ValueStories.FindAsync(id); 

//Area Of Interest Value Drivers 
var aoivaluedriver = (from AOIValueDrivers in db.AOIValueDrivers 
         join aoivd in db.AOIValueDrivers on AOIValueDrivers.AOIVDId equals aoivd.AOIId 
         join aoi in db.AreaOfInterests on aoivd.AOIId equals aoi.AOIId 
         join vs in db.ValueStories on aoi.Id equals vs.Id 
         where aoivd.AOIId == aoi.AOIId && aoi.Id == vs.Id && vs.Id == id 
         select aoivd 
        ).ToList(); 

List<AOIValueDrivers> aoivd1 = new List<AOIValueDrivers>(); 
foreach (var a in aoivaluedriver) 
{ 
    aoivd1.Add(new AOIValueDrivers() 
    { 
     AOIVDId = a.AOIVDId, 
     Item = a.Item, 
     SubItem = a.SubItem, 
     Value = a.Value, 
     AOIId = a.AOIId 

    }); 
} 
//Area pf Interest Value Drivers End 


//Area Of Interest 
var areaOfInterest = (from AreaOfInterest in db.AreaOfInterests 
         join aoi in db.AreaOfInterests on AreaOfInterest.AOIId equals aoi.AOIId 
         join vs in db.ValueStories on aoi.Id equals vs.Id 
         where aoi.Id == vs.Id && vs.Id == id 
         select aoi 
         //{ 
         // AOIName = aoe.AOIName, 
         //ValueDriver = aoe.ValueDriver 
         //} 
          ).ToList(); 

List<AreaOfInterest> aoi1 = new List<AreaOfInterest>(); 
foreach (var a in areaOfInterest) 
{ 
    aoi1.Add(new AreaOfInterest() 
    { 
     AOIId = a.AOIId, 
     AOIName = a.AOIName, 
     Selected = a.Selected, 
     Id = a.Id, 
     AOIValueDrivers = aoivd1 

    }); 
} 

在我的Json结果是它列出我所有的aoivaluedriver数据昂忽略我的Where条件。这里是JSON输出

{ 
    "AreaOfInterest": [ 
    { 
     "AOIId": 1, 
     "AOIName": "Supply Chain/ Direct Materials", 
     "Selected": true, 
     "Id": 1, 
     "ValueStory": null, 
     "AOIValueDrivers": [ 
     { 
      "AOIVDId": 1, 
      "Item": "Negotiate better prices & conditions", 
      "SubItem": "Automate the process of sourcing of direct materials and integrate it to you ERP and key execution systems", 
      "Value": 3, 
      "AOIId": 1, 
      "AreaOfInterest": null 
     }, 
     { 
      "AOIVDId": 2, 
      "Item": "Lower Cost", 
      "SubItem": "Reduct costs of supply chain FTEs", 
      "Value": 3, 
      "AOIId": 1 
     }, 
     { 
      "AOIVDId": 10, 
      "Item": "Negotiate better prices & conditions", 
      "SubItem": "Foster supplier competition to reduce pricing and obtain best market value", 
      "Value": 3, 
      "AOIId": 2 
     }, 
     { 
      "AOIVDId": 19, 
      "Item": "Negotiate better prices & conditions", 
      "SubItem": "Control and maximise savings on non strategically source spend", 
      "Value": 3, 
      "AOIId": 3 
     }, 
     { 
      "AOIVDId": 24, 
      "Item": "Buy and pay at the negotiated rate & conditions", 
      "SubItem": "Reduce invoice matching exceptions (to contracts, orders, & receipts)", 
      "Value": 3, 
      "AOIId": 4 
     }, 
     { 
      "AOIVDId": 34, 
      "Item": "Free up working capital", 
      "SubItem": "Offer suppliers options to get paid quicker while not reducing DPO", 
      "Value": 3, 
      "AOIId": 5 
     }, 
     { 
      "AOIVDId": 38, 
      "Item": "Protect your revenue", 
      "SubItem": "Access to systems such as Dun & Bradstreet to certify suppliers", 
      "Value": 3, 
      "AOIId": 6 
     }, 
     { 
      "AOIVDId": 43, 
      "Item": "nothing", 
      "SubItem": "nothing", 
      "Value": 0, 
      "AOIId": 7 
     } 
     ] 
    } 
    ] 
} 

预期的结果是,它应该只AOIId = 1,而是其返回的所有表中的项目将返回所有项目。我的查询有什么问题?对EF和Linq仍然很陌生,仍然试图让自己熟悉它。

这里是我的areaofinterest

CREATE TABLE [dbo].[AreaOfInterest] (
    [AOIId] INT   IDENTITY (1, 1) NOT NULL, 
    [AOIName] NVARCHAR (MAX) NOT NULL, 
    [Selected] BIT   NOT NULL, 
    [Id]  INT   NOT NULL, 
    CONSTRAINT [PK_dbo.AreaOfInterest] PRIMARY KEY CLUSTERED ([AOIId] ASC), 
    CONSTRAINT [FK_dbo.AreaOfInterest_dbo.ValueStory_Id] FOREIGN KEY ([Id]) REFERENCES [dbo].[ValueStory] ([Id]) ON DELETE CASCADE 
); 

GO 
CREATE NONCLUSTERED INDEX [IX_Id] 
    ON [dbo].[AreaOfInterest]([Id] ASC); 

数据库建模,这里是一个为areaofinterestvaluedriver

CREATE TABLE [dbo].[AOIValueDrivers] (
    [AOIVDId] INT   IDENTITY (1, 1) NOT NULL, 
    [Item] NVARCHAR (MAX) NULL, 
    [SubItem] NVARCHAR (MAX) NULL, 
    [Value] INT   NOT NULL, 
    [AOIId] INT   NOT NULL, 
    CONSTRAINT [PK_dbo.AOIValueDrivers] PRIMARY KEY CLUSTERED ([AOIVDId] ASC), 
    CONSTRAINT [FK_dbo.AOIValueDrivers_dbo.AreaOfInterest_AOIId] FOREIGN KEY ([AOIId]) REFERENCES [dbo].[AreaOfInterest] ([AOIId]) ON DELETE CASCADE 
); 
GO 
CREATE NONCLUSTERED INDEX [IX_AOIId] 
    ON [dbo].[AOIValueDrivers]([AOIId] ASC); 

预期的JSON输出应该是这样的

{ 
    "AreaOfInterest": [ 
    { 
     "AOIId": 1, 
     "AOIName": "Supply Chain/ Direct Materials", 
     "Selected": true, 
     "Id": 1, 
     "ValueStory": null, 
     "AOIValueDrivers": [ 
     { 
      "AOIVDId": 1, 
      "Item": "Negotiate better prices & conditions", 
      "SubItem": "Automate the process of sourcing of direct materials and integrate it to you ERP and key execution systems", 
      "Value": 3, 
      "AOIId": 1, 
      "AreaOfInterest": null 
     } 
     ] 
    } 
    ], 
    "AreaOfInterest": [ 
    { 
     "AOIId": 2, 
     "AOIName": "Supply Chain/ Direct Materials", 
     "Selected": true, 
     "Id": 1, 
     "ValueStory": null, 
     "AOIValueDrivers": [ 
     { 
      "AOIVDId": 10, 
      "Item": "Negotiate better prices & conditions", 
      "SubItem": "Foster supplier competition to reduce pricing and obtain best market value", 
      "Value": 3, 
      "AOIId": 2 
     } 
     ] 
    } 
    ], 
    "AreaOfInterest": [ 
    { 
     "AOIId": 3, 
     "AOIName": "Supply Chain/ Direct Materials", 
     "Selected": true, 
     "Id": 1, 
     "ValueStory": null, 
     "AOIValueDrivers": [ 
     { 
      "AOIVDId": 19, 
      "Item": "Negotiate better prices & conditions", 
      "SubItem": "Control and maximise savings on non strategically source spend", 
      "Value": 3, 
      "AOIId": 3 
     } 
     ] 
    } 
    ] 
} 

这是怎么了我的模特看起来:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Web; 

namespace WebService.Models 
{ 
    public class AreaOfInterest 
    { 


     [Key] 
     public int AOIId { get; set; } 
     [Required] 
     public string AOIName { get; set; } 
     public bool Selected { get; set; } 

     // Foreign Key 
     public int Id { get; set; } 
     // Navigation property 
     public virtual ValueStory ValueStory { get; set; } 

     //Value Drivers AOI for the Value Story 
     public List<AOIValueDrivers> AOIValueDrivers { get; set; } 

    } 

    public class AOIValueDrivers 
    { 
     [Key] 
     public int AOIVDId { get; set; } 
     public string Item { get; set; } 
     public string SubItem { get; set; } 
     public int Value { get; set; } 

     // Foreign Key 
     public int AOIId { get; set; } 
     // Navigation property 
     public virtual AreaOfInterest AreaOfInterest { get; set; } 

    } 

} 

这是工作的代码

 //Area Of Interest Value Drivers 
     var aoivaluedriver = (from AOIValueDrivers in db.AOIValueDrivers 
          join aoivd in db.AOIValueDrivers on AOIValueDrivers.AOIVDId equals aoivd.AOIId 
          join aoi in db.AreaOfInterests on aoivd.AOIId equals aoi.AOIId 
          select aoivd 
          ).ToList(); 

     List<AOIValueDrivers> aoivd1 = new List<AOIValueDrivers>(); 
     foreach (var a in aoivaluedriver) 
     { 
      aoivd1.Add(new AOIValueDrivers() 
      { 
       AOIVDId = a.AOIVDId, 
       Item = a.Item, 
       SubItem = a.SubItem, 
       Value = a.Value, 
       AOIId = a.AOIId 

      }); 
     } 
    //Area pf Interest Value Drivers End 

    //Area Of Interest 
    var areaOfInterest = (from AreaOfInterest in db.AreaOfInterests 
          join aoi in db.AreaOfInterests on AreaOfInterest.AOIId equals aoi.AOIId 
          join vs in db.ValueStories on aoi.Id equals vs.Id 
          where aoi.Id == vs.Id && vs.Id == id 
          select aoi).ToList(); 



    List<AreaOfInterest> aoi1 = new List<AreaOfInterest>(); 
    foreach (var a in areaOfInterest) 
    { 
     aoi1.Add(new AreaOfInterest() 
     { 
      AOIId = a.AOIId, 
      AOIName = a.AOIName, 
      Selected = a.Selected, 
      Id = a.Id, 
      AOIValueDrivers = aoivd1?.Where(vd => vd.AOIId == a.AOIId)?.ToList() 

     }); 
    } 
    //Area pf Interest End 
+0

您的查询是没有意义的。为什么你自己加入'db.AreaOfInterests',然后将它加入到'db.ValueStories'中,但从不使用值'db.ValueStories'? – DavidG

+1

你可以发布你的数据库建模这些表吗?我认为你有一个懒加载问题,因为你的表关系。 –

+1

@Erick,我已经更新了我的帖子,数据库结构 –

回答

1

我们来试试这里事情简单化。

利用实体框架延迟加载方法和建模,我假设你实体建模是正确的,你可以做一些事情(只是一个例子)。

//Area Of Interest 
var areaOfInterest = (from AreaOfInterest in db.AreaOfInterests.Include(a => a.AOIValueDrivers) 
         join aoi in db.AreaOfInterests on AreaOfInterest.AOIId equals aoi.AOIId 
         join vs in db.ValueStories on aoi.Id equals vs.Id 
         where aoi.Id == vs.Id && vs.Id == id 
         select aoi).ToList(); 


List<AreaOfInterest> aoi1 = new List<AreaOfInterest>(); 
foreach (var a in areaOfInterest) 
{ 
    aoi1.Add(new AreaOfInterest() 
    { 
     AOIId = a.AOIId, 
     AOIName = a.AOIName, 
     Selected = a.Selected, 
     Id = a.Id, 
     AOIValueDrivers = a.AOIValueDrivers.Where(vd => vd.AOIId == a.AOIId).ToList() 
    }); 
} 

你并不需要做两个查询,因为当你做一个选择上的实体有相关的关系懒由实体框架加载其他实体。

了解更多有关在这里https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx这里http://www.entityframeworktutorial.net/EntityFramework4.3/lazy-loading-with-dbcontext.aspx

+0

我试过这个,但我得到一个CS0266错误: 不能将类型'system.collections.generic.ienumerable '转换为'System.collections.generic.list vd.AOIId == a.AOIId) –

+0

将ToList()放在where的末尾。看我的编辑。 –

+0

早些时候尝试过,但当我在Postman上运行它时出现此错误: [link] https://ibb.co/gsda4k –

0

我不明白很多,但按代码的LINQ查询是不正确的。查询中where子句是错误的。

如果你想AOIID == 1的项目,那么下面的代码将工作。

var aoivaluedriver = (from AOIValueDrivers in db.AOIValueDrivers 
        join aoivd in db.AOIValueDrivers on AOIValueDrivers.AOIVDId equals aoivd.AOIId 
        join aoi in db.AreaOfInterests on aoivd.AOIId equals aoi.AOIId 
        join vs in db.ValueStories on aoi.Id equals vs.Id 
        where aoivd.AOIId == 1 
        select aoivd 
       ).ToList(); 

-Gagan https://blossomprogramming.blogspot.in/

+0

我已经试过了。我通过发布进行了更新,并包含了预期的json输出。 –

相关问题