Sql sections.Generic.List1[System.Int32]ToList[Int32](System.Collections.Generic.IEnumerable1[System.Int32])方法,此方法无法转换为存储表达式。count!!
Sql sections.Generic.List1[System.Int32]ToList[Int32](System.Collections.Generic.IEnumerable1[System.Int32])方法,此方法无法转换为存储表达式。count!!,sql,asp.net-mvc,linq,linq-to-sql,Sql,Asp.net Mvc,Linq,Linq To Sql,sections.Generic.List1[System.Int32]ToList[Int32](System.Collections.Generic.IEnumerable1[System.Int32])方法,此方法无法转换为存储表达式。count!!??!?如果PositionId=1的position只有驾驶技能,而工人只有漂移技能,该怎么办??通过您的查询,任何工人只有一项技能,称为熟练工人对不起,我不明白您的意思,“通过您的查询,任何工人只有一项技能,称为熟练工人—“我的理解是,一个
sections.Generic.List
1[System.Int32]ToList[Int32](System.Collections.Generic.IEnumerable
1[System.Int32])方法,此方法无法转换为存储表达式。count!!??!?如果PositionId=1的position
只有驾驶技能,而工人只有漂移技能,该怎么办??通过您的查询,任何工人只有一项技能,称为熟练工人
对不起,我不明白您的意思,“通过您的查询,任何工人只有一项技能,称为熟练工人—“我的理解是,一个职位可以有多种技能,一个工人会来应聘一个职位,所以我们需要一个能满足该职位所有技能的工人。我想知道我错在哪里。对您的问题“如果PositionId=1的职位只有驾驶技能,而工人只有漂移技能会怎样?”——那么您将在哪个职位上添加漂移技能?您得到的是正确的,职位可以有多种技能,工人将来应聘一个职位,因此,我们需要一名满足该职位所有技能的员工,问题是谁的员工具备该职位所具备的所有特定技能,但你只需将员工技能的计数与职位技能的计数进行比较即可,通过您的查询,如果员工与拥有所有岗位技能的员工具有相同的岗位技能申报技能计数,但是员工技能与岗位技能可能不同,但是他们可以具有相同的计数!!是的,我可以理解你所说的,当一个工人在司机和职员两方面都有技能时,例如,如果他知道文档编写和漂移,那么这个代码将不起作用,但是如果他专门针对某个特定职位的特定技能,例如单独驾驶,那么这个代码就起作用。如前所述,如果一个人可能同时具备两个职位的技能,则必须修改表格设计
添加新代码,以帮助他同时具备两个职位的技能“司机”和“职员”先生,您的建议很有希望,但当我在我的项目中尝试时,它只会返回此代码“物化查询结果不支持此方法。”我如何解决此问题?是的..不要在我告诉您不要使用的位置使用tolist。出现了另一个错误,先生“Internal.NET Framework Data Provider error 1025”。“您是否遇到此类错误我的理解是EntityFramework在将查询编译为SQL查询时会优化查询。用一个查询代替三个查询似乎会更快,因为当你将其分解时,你将有三次往返来获得答案??我不确定不使用连接是什么意思???@user3294517 ORMs的目的是抽象出数据库中的结构和关系。将ID
列和ClientCusPosId
列上的Client\u Customer\u Position
与ClientCusPosId
列中的Client\u Customer\u Position
连接的逻辑在所有查询中都很常见,但是,如果使用连接,则会在任何地方重复。关联的要点是将join
逻辑封装到ORM层中。此外,您无偿使用.ToList()
将产生大量的数据库往返。创建IQueryable
不会影响数据库。你应该在谷歌上搜索懒散的计算。我想我已经回答了你的问题,它应该能有效地工作,因为EntityFramework在执行链接查询时会创建一个优化的SQL查询。这应该比最后运行三个查询并返回正确的值更快。你怎么认为?
| Position | PositionId |
| driver | 1 |
| clerk | 2 |
| SkillId | skill | PositionId |
| 1 | driving | 1 |
| 2 | drifting | 1 |
| Name | WorkerId |
| John | 1 |
| alex | 2 |
| skillId | skill | WorkerId |
| 1 | driving | 1 |
| 2 | drifting | 1 |
var PositionsWithSkills = (from a in db.Client_Customer_Position
where a.ID == position
select new
{
PositionID = a.ID,
RequiredSkills = (from b in db.Client_Customer_Position_Skills
where b.ClientCusPosId == a.ID
select b.SkillName)
}).ToList();
var WorkersWithSkills = (from x in db.Workers
select new
{
workerId = x.ID,
Skills = (from y in db.Worker_Skills
where y.Worker_ID == x.ID
select y.SkillName)
}).ToList();
var PositionWithSkilledWorkers = (from pos in PositionsWithSkills
select new
{
PositionId = pos.PositionID,
Workers = (from worker in WorkersWithSkills
where pos.RequiredSkills.All(skill => worker.Skills.Any(workerSkill => workerSkill == skill))
select worker.workerId)
}).ToList();
var PositionsWithSkills = (from a in Positions select new {
PositionID = a.PositionId,
RequiredSkills = (from b in PositionSkills where b.PositionId == a.PositionId select b.skillId).ToList()
}).ToList();
var WorkersWithSkills = (from x in Workers select new {
Name = x.Name,
Skills = (from y in WorkerSkills where y.WorkerId == x.WorkerID select y.skillId).ToList()
}).ToList();
var PositionWithSkilledWorkers = (from pos in PositionsWithSkills select new {
PositionId = pos.PositionID,
Workers = (from worker in WorkersWithSkills where pos.RequiredSkills.All(skill => worker.Skills.Any(workerSkill => workerSkill == skill)) select worker.Name).ToList()
}).ToList();
var workerWithallSkill = (from u in db.workerList join x in db.workerSkillList on u.WorkerId equals x.WorkerId
where ((from y in db.workerSkillList where y.WorkerId == u.WorkerId select y).Count() == (from p in db.positionSkillList where p.PositionId == 1("pass your positionId here") select p).Count())
select u).ToList().Distinct();
var workerWithallSkill = (from u in workerList join x in workerSkillList on u.WorkerId equals x.WorkerId where (workerSkillList.Where(y=> y.WorkerId == u.WorkerId).Count() == positionSkillList.Where(p=>p.PositionId == 1).Count()) select u).ToList().Distinct();
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication8
{
class Program
{
static void Main(string[] args)
{
IList<Position> positionList = new List<Position>() {
new Position(){ position="Driver", PositionId=1}
,new Position(){ position="clerk", PositionId=2}
};
IList<PositionSkill> positionSkillList = new List<PositionSkill>() {
new PositionSkill(){ Skill = "driving",skillid = 1,PositionId = 1}
,new PositionSkill(){ Skill = "drifting",skillid = 2,PositionId = 1}
};
IList<Worker> workerList = new List<Worker>() {
new Worker(){ name = "John",WorkerId = 1}
,new Worker(){ name = "alex",WorkerId = 2}
};
IList<WorkerSkill> workerSkillList = new List<WorkerSkill>(){
new WorkerSkill(){Skill = "driving",skillid = 1,WorkerId = 2}
, new WorkerSkill(){Skill = "drifting",skillid = 2,WorkerId = 2}
};
var workerWithallSkill = (from u in workerList join x in workerSkillList on u.WorkerId equals x.WorkerId where (workerSkillList.Where(y => y.WorkerId == u.WorkerId).Count() == positionSkillList.Where(p => p.PositionId == 1).Count()) select u).ToList().Distinct();
foreach (var worker in workerWithallSkill)
{
Console.WriteLine(worker.name);
}
Console.ReadLine();
}
}
public class Position
{
public string position { get; set; }
public int PositionId { get; set; }
}
public class PositionSkill
{
public int skillid { get; set; }
public string Skill { get; set; }
public int PositionId { get; set; }
}
public class Worker
{
public string name { get; set; }
public int WorkerId { get; set; }
}
public class WorkerSkill
{
public int skillid { get; set; }
public string Skill { get; set; }
public int WorkerId { get; set; }
}
}
var WorkerPositionSkill = from p in db.positionSkillList join q in db.workerSkillList on p.skillid equals q.skillid select new { posSkill = p, workerSkill = q };
var workerWithallSkill = (from u in db.workerList join x in db.workerSkillList on u.WorkerId equals x.WorkerId where (WorkerPositionSkill.Where(y => y.workerSkill.WorkerId == u.WorkerId && y.posSkill.PositionId == 1).Count() == db.positionSkillList.Where(p => p.PositionId == 1).Count()) select u).ToList().Distinct();
var PositionsWithSkills = from a in db.Client_Customer_Position
where a.ID == position
select new
{
PositionID = a.ID,
RequiredSkills = (from b in db.Client_Customer_Position_Skills
where b.ClientCusPosId == a.ID
select b.SkillName)
};
var WorkersWithSkills = from x in db.Workers
select new
{
workerId = x.ID,
Skills = (from y in db.Worker_Skills
where y.Worker_ID == x.ID
select y.SkillName)
};
var PositionWithSkilledWorkers = from pos in PositionsWithSkills
from worker in WorkersWithSkills
where pos.RequiredSkill.All(worker.Skills.Contains)
group worker.Name by pos.PositionID;
// skills of specific position
var PositionSkills = Context.PositionSkill.Where(u => u.PositionId == 1);
var WorkersWithSkills = Context.Worker
.Join(Context.WorkerSkill,
worker => worker.WorkerId,
workerSkill => workerSkill.WorkerId,
(worker, workerSkill) => new { worker, workerSkill })
.GroupBy(u => u.worker)
.Select(u => new
{
u.Key.WorkerId,
u.Key.Name,
Skills = u.Select(t => t.workerSkill.skill)
});
var SkilledWorkers = WorkersWithSkills
.Where(u => PositionSkills.All(t => u.Skills.Contains(t.skill)))
.ToList();
void Main()
{
// Table Setup
// ************
var position = new List<Position>();
position.Add(new Position { Id = 1, Name = "driver" });
position.Add(new Position { Id = 2, Name = "clerk" });
var positionSkill = new List<PositionSkill>();
positionSkill.Add(new PositionSkill { Id = 1, Skill = "driving", PositionId = 1 });
positionSkill.Add(new PositionSkill { Id = 2, Skill = "drifting", PositionId = 1 });
var worker = new List<Worker>();
worker.Add(new Worker { Id = 1, Name = "John" });
worker.Add(new Worker { Id = 2, Name = "alex" });
var workerSkill = new List<WorkerSkill>();
workerSkill.Add(new WorkerSkill { Id = 1, Skill = "driving", WorkerId = 1 });
workerSkill.Add(new WorkerSkill { Id = 2, Skill = "drifting", WorkerId = 1 });
// The Query
// *********
var positionValue = 1;
var r = from p in position
join ps in positionSkill on p.Id equals ps.PositionId
join ws in workerSkill on ps.Skill equals ws.Skill
join w in worker on ws.WorkerId equals w.Id
where p.Id == positionValue
select new {
PositionName = p.Name,
WorkerName = w.Name
};
// Get Distinct Names
r.Distinct().Dump();
}
// Define other methods and classes here
public class Position
{
public int Id { get; set; }
public string Name { get; set; }
}
public class PositionSkill
{
public int Id { get; set; }
public string Skill { get; set; }
public int PositionId { get; set; }
}
public class Worker
{
public int Id { get; set; }
public string Name { get; set; }
}
public class WorkerSkill
{
public int Id { get; set; }
public string Skill { get; set; }
public int WorkerId { get; set; }
}