Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 实体框架(在中使用并选择Distinct)_C#_Entity Framework - Fatal编程技术网

C# 实体框架(在中使用并选择Distinct)

C# 实体框架(在中使用并选择Distinct),c#,entity-framework,C#,Entity Framework,我是Entity Framework 6.0的新手,遇到了一种情况,我想在我的C应用程序中执行一个类似于此SQL查询的查询: select * from periods where id in (select distinct periodid from ratedetails where rateid = 3) 在EF中是否真的可以执行这样的查询,或者我是否需要将其分解为更小的步骤 是的,这是可以做到的,但是你应该为你的查询提供一个更好的例子。你已经提供了一个糟糕的起点。让我们用这个: SE

我是Entity Framework 6.0的新手,遇到了一种情况,我想在我的C应用程序中执行一个类似于此SQL查询的查询:

select * from periods where id in (select distinct periodid from ratedetails where rateid = 3)

在EF中是否真的可以执行这样的查询,或者我是否需要将其分解为更小的步骤

是的,这是可以做到的,但是你应该为你的查询提供一个更好的例子。你已经提供了一个糟糕的起点。让我们用这个:

SELECT value1, value2, commonValue
FROM table1
WHERE EXISTS ( 
    SELECT 1 
    FROM table2 
    WHERE table1.commonValue = table2.commonValue
    // include some more filters here on table2 
)
首先,它几乎总是更好地使用EXISTS而不是IN

现在把它转换成一个Lambda应该是这样的,同样的,你没有提供对象或对象图,所以我会编一些东西

DbContext myContext = this.getContext();
var myResults = myContext.DbSet<Type1>().Where(x => myContext.DbSet<Type2>().Any(y => y.commonValue == x.commonValue)).Select(x => x);
你要找的拉姆达声明

DbContext myContext = this.getContext();
var myResults = myContext.DbSet<Periods>()
    .Where(x => myContext.DbSet<RateDetails>().Any(y => y.periodid == x.id && y.rateid == 3))
    .Select(x => x);
这里是学习lamda以及如何使用它们的一个很好的起点


这是查询中的第二个where子句

var priodidList=ratedetails.where(x=>x.rateid ==3).DistinctBy(x=>x.rateid);
现在是查询的第一部分

var selected = periods.Where(p => p.id 
            .Any(a => priodidList.Contains(a.periodid ))
            .ToList();

假设您的上下文类中有:

数据集周期

DbSet费率详细信息

您可以使用以下Linq:

var distincts = dbContext.RateDetails
                         .Where(i => i.rateId == 3)
                         .Select(i => i.PeriodId)
                         .Distinct();

var result = dbContext.Periods
                      .Where(i => i.Id)
                      .Any(j => distincts.Contains(j.Id));
编辑:根据您的实体,您可能需要一个自定义比较器来进行区分。您可以找到教程,也可以


或者使用更多Linq魔术来分割结果。

此查询与“从ratedetails中选择*其中rateid=x”有什么区别?我的帖子中翻转了查询。对不起,请再次检查。如下所述,您应该使用IN或JOIN而不是IN子句,如果你在谷歌上搜索,你可以找到更多像这样的文章。它还使sql或lamda更具可读性。谢谢,正如我暗示的,我还在学习。我也很感激参考链接。
var distincts = dbContext.RateDetails
                         .Where(i => i.rateId == 3)
                         .Select(i => i.PeriodId)
                         .Distinct();

var result = dbContext.Periods
                      .Where(i => i.Id)
                      .Any(j => distincts.Contains(j.Id));