C# 如何在EF中获取与组合列表(键/值)匹配的记录?
我有一个数据库表,其中包含每个用户/年组合的记录 如何使用EF和用户ID/年组合列表从数据库中获取数据? 样本组合:C# 如何在EF中获取与组合列表(键/值)匹配的记录?,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一个数据库表,其中包含每个用户/年组合的记录 如何使用EF和用户ID/年组合列表从数据库中获取数据? 样本组合: UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91 1999 我只需要上述组合中定义的记录。我不知道如何使用EF/Linq编写这个 List<UserYearC
UserId Year
1 2015
1 2016
1 2018
12 2016
12 2019
3 2015
91 1999
我只需要上述组合中定义的记录。我不知道如何使用EF/Linq编写这个
List<UserYearCombination> userYears = GetApprovedYears();
var records = dbcontext.YearResults.Where(?????);
你可以试试这个
//add the possible filters to LIST
var searchIds = new List<string> { "1-2015", "1-2016", "2-2018" };
//use the list to check in Where clause
var result = (from x in YearResults
where searchIds.Contains(x.UserId.ToString()+'-'+x.Year.ToString())
select new UserYearCombination
{
UserId = x.UserId,
Year = x.Year
}).ToList();
这是我以前讨论过的一个臭名昭著的问题。克里希纳·穆帕拉的解决方案是我在那里提出的解决方案之一。它的缺点是不可搜索,即它不能从涉及的数据库字段上的任何索引中获益 与此同时,我创造了另一种解决方案,在某些情况下可能会有所帮助。基本上,它通过一个字段对输入数据进行分组,然后通过分组键和组元素的Contains查询查找并合并数据库数据:
IQueryable items=null;
foreach(userYears.GroupBy中的var yearuserid(t=>t.Year,t=>t.UserId))
{
var userIds=yearUserIds.ToList();
var grp=dbcontext.YearResults
.Where(x=>x.Year==yearUserIds.Key
&&包含(x.UserId));
items=items==null?grp:items.Concat(grp);
}
我在这里使用Concat
,因为Union
会浪费时间来区分结果,在EF6中Concat
将使用链式Union
语句生成SQL,而Union
生成嵌套的Union
语句,可能会达到最大嵌套级别
当索引就位时,此查询的性能可能足够好。理论上,SQL语句中的UNION
s的最大数量是无限的,但是In
子句中的In(包含转换为的)项数不应超过几千项。也就是说
数据内容将决定哪个分组字段的性能更好,Year
或UserId
。挑战在于尽量减少联合
的数量,同时将中所有条款中的项目数量保持在5000左右。您能否发布用户年组合
和年结果
类?将类添加到问题记录中应该是列表
?这是否回答了您的问题@KrishnaMuppalla您能否确认您的方法不会触发客户端评估?
//add the possible filters to LIST
var searchIds = new List<string> { "1-2015", "1-2016", "2-2018" };
//use the list to check in Where clause
var result = (from x in YearResults
where searchIds.Contains(x.UserId.ToString()+'-'+x.Year.ToString())
select new UserYearCombination
{
UserId = x.UserId,
Year = x.Year
}).ToList();
var d = YearResults
.Where(x=>searchIds.Contains(x.UserId.ToString() + '-' + x.Year.ToString()))
.Select(x => new UserYearCombination
{
UserId = x.UserId,
Year = x.Year
}).ToList();