Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在EF中获取与组合列表(键/值)匹配的记录?_C#_Entity Framework_Linq - Fatal编程技术网

C# 如何在EF中获取与组合列表(键/值)匹配的记录?

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

我有一个数据库表,其中包含每个用户/年组合的记录

如何使用EF和用户ID/年组合列表从数据库中获取数据? 样本组合

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