Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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# 实体框架6查询与不同的过滤器_C#_Entity Framework_Visual Studio 2013_Entity Framework 6 - Fatal编程技术网

C# 实体框架6查询与不同的过滤器

C# 实体框架6查询与不同的过滤器,c#,entity-framework,visual-studio-2013,entity-framework-6,C#,Entity Framework,Visual Studio 2013,Entity Framework 6,我有个问题。当我运行下面的代码时: var data = context.TableX.Where(w => w.userId == 9999&& w.id == 9999) .Distinct().ToList(); 这是生成的查询: SELECT [Extent1].[id] AS [id], [Extent1].[name] AS [name], [Extent1].[companyId] AS [companyId], [Extent1].[userId] AS

我有个问题。当我运行下面的代码时:

var data = context.TableX.Where(w => w.userId == 9999&& w.id == 9999) .Distinct().ToList();
这是生成的查询:

SELECT [Extent1].[id] AS [id], [Extent1].[name] AS [name], [Extent1].[companyId] AS [companyId], [Extent1].[userId] AS [userId] FROM [TableX] AS [Extent1] WHERE (9999 = [Extent1].[userId]) AND (9999= [Extent1].[id]) -- Executing at 01/06/2016 17:28:01 -03:00 -- Completed in 271 ms with result: SqlDataReader
我想知道您是否可以使“Distinct”与查询一起运行,如下所示:

SELECT DISTINCT id, name, companyId AS type FROM TableX WHERE id=9999 AND userId=9999

谢谢。

要获得您想要的查询,您需要先调用
选择
然后再调用
Distinct
以仅获取需要应用Distinct的列:

var data = context.TableX.Where(w => w.userId == 9999&& w.id == 9999)
                         .Select(e=>new {e.id, e.name, e.companyId}) 
                         .Distinct()
                         .ToList();
更新1 我非常确定第一个查询应该可以工作,但无论如何,另一个解决方案可能是通过以下方式应用组:

var data = context.TableX.Where(w => w.userId == 9999&& w.id == 9999)
                         .GroupBy(e=>new {e.id, e.name, e.companyId}) 
                         .Select(g=>new{g.Key.id, g.Key.name, g.Key.companyId})
                         .ToList();
更新2 现在,我在另一个上下文中测试了LinqPad中的第一个查询,但使用了相同的想法:

var query=Agencies.Where(a=>a.StatusId==1)
                  .Select(e=>new{e.StateId, e.AgencyName})
                  .Distinct()
                  .Dump();
这是生成的sql:

-- Region Parameters
DECLARE @p0 Int = 1
-- EndRegion
SELECT DISTINCT [t0].[stateId] AS [StateId], [t0].[agencyName] AS [AgencyName]
FROM [Agencies] AS [t0]
WHERE [t0].[statusId] = @p0
正如你所看到的,它应该是有效的,我真的不知道你的情况发生了什么

对要通过LinqPad执行的第二个查询重复相同的过程:

var query=Agencies.Where(a=>a.StatusId==1)
                  .GroupBy(e=>new{e.StateId, e.AgencyName})
                  .Select(g=>new{g.Key.StateId, g.Key.AgencyName})
                  .Dump();
这是sql代码:

-- Region Parameters

DECLARE @p0 Int = 1
-- EndRegion
SELECT [t0].[stateId] AS [StateId], [t0].[agencyName] AS [AgencyName]
FROM [Agencies] AS [t0]
WHERE [t0].[statusId] = @p0
GROUP BY [t0].[stateId], [t0].[agencyName]

id
是否唯一?(通常是这样)因为如果是这样,那么所有结果都将是不同的,无论是否使用
distinct
关键字。也许EF认识到了这一点,而没有使用它。您的表中是否有多条userid=9999和id=9999的记录?在sql中,Distinct关键字的计算开销通常很大。如果没有multilpe匹配记录,linq的版本可能会更好,即使如此,如果有多个返回,我希望它执行不同的客户端。id不是唯一的,这就是为什么我需要在查询中使用“distinct”。即使id不是唯一的,如果您先使用代码,EF可能会认为它是唯一的。从“如果类上的属性名为“ID”(不区分大小写),则代码首先推断属性是主键,或者类名后跟“ID”。如果主键属性的类型是数字或GUID,则将其配置为标识列。请参阅代码生成的内容:选择[Extent1]。[ID]作为[ID],[Extent1]。[name]作为[name],[Extent1]。[companyId]作为[companyId]作为[Extent1],[Extent1]作为[id],[Extent1]。[name]作为[name],[Extent1]。[companyId]作为[id]作为[id],我忘了where子句:
选择[Extent1]。[name]作为[name],[Extent1]。[companyId]作为表X中的[companyId]为[Extent1],其中(5093=[Extent1].[userId])和(2698=[Extent1].[id])
现在我发现了这篇文章,它可以被视为一个副本,它的想法完全相同:最大的问题是distinct没有运行。它返回六条完全相同的记录,而数据库中的distinct返回1。