C# 使用EF时条件不能正常工作的Linq
我一直在试图找出我的查询出了什么问题,并且一直在和Where条件打一个回合,但并没有运气。下面是我在控制器文件中的查询C# 使用EF时条件不能正常工作的Linq,c#,json,linq,C#,Json,Linq,我一直在试图找出我的查询出了什么问题,并且一直在和Where条件打一个回合,但并没有运气。下面是我在控制器文件中的查询 ValueStory valuestory = await db.ValueStories.FindAsync(id); //Area Of Interest Value Drivers var aoivaluedriver = (from AOIValueDrivers in db.AOIValueDrivers join aoi
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
});
}
预期结果是,它应该只返回AOIId=1的所有项,而不是返回表中的所有项。我的问题可能出了什么问题?对英孚和林克来说还是很陌生的,而且还在努力让自己熟悉它
下面是我感兴趣的领域的db建模
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);
这是一个用于感兴趣的区域值驱动程序
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
我不太了解,但根据代码,您的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();
-加根
让我们试着简化这里的事情 利用实体框架延迟加载方法和建模,我假设您的实体建模是正确的,您可以做一些类似示例的事情
//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()
});
}
您不需要进行两次查询,因为当您对与其他实体相关的实体进行选择时,实体框架会延迟加载关系
在此处和此处查找更多信息您的查询没有意义。为什么您要自连接到db.areaofinterest,然后再连接到db.ValueStories,但从不使用db.ValueStories的值?您可以发布这些表的数据库建模吗?我认为你有一个延迟加载问题,因为你的表关系。@Erick,我已经用数据库更新了我的帖子structure@David,db.ValueStories中的Id是我对json数组的Get Id引用,但您没有选择任何db.ValueStories,相反,你是懒洋洋地从无法过滤的父级加载它们。我已经试过了。我通过post进行了更新,并包含了预期的json输出。我尝试了此操作,但遇到了一个CS0266错误:无法将类型“system.collections.generic.ienumerable”隐式转换为“system.collections.generic.List”之前尝试过此操作,但在Postman:[链接]上运行时遇到此错误,请检查a.AOIValueDrivers是否为null,如果是,那么您的延迟加载将变为false。请尝试将此a.AOIValueDrivers?放入列表中。其中vd=>vd.AOIId==a.AOIId?。ToList可防止空引用,并检查是否获得空对象。以防,我已更新了我的帖子,包括我的模型类。是的,AOIValueDrivers为空。在我的context.cs this.Configuration.LazyLoadingEnabled=true中,我还将lazyloading设置为true;this.Configuration.ProxyCreationEnabled=true;
//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()
});
}