Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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# SelectMany Count生成显式sql语句_C#_Database_Linq_Entity Framework - Fatal编程技术网

C# SelectMany Count生成显式sql语句

C# SelectMany Count生成显式sql语句,c#,database,linq,entity-framework,C#,Database,Linq,Entity Framework,我有一个这样的结构: public class Tag { public int TagId { get; set; } public virtual ICollection<Vacancy> Vacancies { get; set; } // ... } public class Vacancy { public int VacancyId { get; set; } public virtual

我有一个这样的结构:

public class Tag
{
        public int TagId { get; set; }
        public virtual ICollection<Vacancy> Vacancies { get; set; }
        // ...
}

public class Vacancy
{
        public int VacancyId { get; set; }
        public virtual ICollection<Tag> Tags { get; set; }
        // ...
}
它工作得很好,但是这个查询似乎没有得到很好的优化。当我遇到探查器时,我得到以下信息:

exec sp_executesql N'SELECT 
[Extent2].[VacancyId] AS [VacancyId], 
[Extent2].[Title] AS [Title], 
[Extent2].[Salary] AS [Salary], 

...props... etc...

FROM  [dbo].[VacancyTagVacancies] AS [Extent1]
INNER JOIN [dbo].[Vacancies] AS [Extent2] ON [Extent1].[Vacancy_VacancyId] = [Extent2].[VacancyId]
WHERE [Extent1].[VacancyTag_VacancyTagId] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1
换句话说,它不使用COUNT sql关键字,只返回整个集合并在sql Server外部计算它


如何优化LINQ查询以便在此处使用COUNT而不是选择all?谢谢。

一种方法是直接执行SQL,如下所示:

string nativeSQLQuery = "SELECT count(*) FROM <tables join>";

var queryResult = ctx.ExecuteStoreQuery<int>(nativeSQLQuery);
string nativeSQLQuery=“选择count(*)FROM”;
var queryResult=ctx.ExecuteStoreQuery(nativeSQLQuery);

您的
用户选择的标记
不是一个查询,这意味着
t.ungages
成为对客户端属性的引用,当枚举时,该属性将检索该特定
标记的所有
ungages
。然后,
计数
在客户端运行

您需要从服务器端开始:

int count = (
    from tag in context.Tags
    where userSelectedTags.Contains(tag)
    from v in tag.Vacancies
    select v).Count();

如果这还不起作用,您可能需要创建一个
userSelectedTags
而不是
userSelectedTags

是否创建
userSelectedTags.Select(t=>t.ungaments.Count()).Sum()
更好?不,查询是相同的。我认为这不是因为SelectMany,它看起来取决于t。VacanceSit给出了编译错误:范围变量“tag”与先前声明的“tag”@user337085冲突。如果范围中已有变量
tag
,则需要在此处重命名该变量
from t in context.Tags其中userSelectedTags.Contains(t)from v in t.select v
它不适用于userSelectedTags,但适用于userSelectedTags。谢谢,伙计!你真是天才!啊,还有一个问题是,只有当UserSelectedTagID包含1个标记id时,它才可以正常工作。但是如果有两个标记id,linq会将查询转换为类似“and([Extent1].[tag_TagId]IN(1,8)),并返回格式不正确的OR结果。但我需要这里和结果。@user337085,它与您在问题中得到的结果相匹配。我看不出你想要什么结果,你能编辑你的问题,给出一个能给你正确结果的表达式吗?
string nativeSQLQuery = "SELECT count(*) FROM <tables join>";

var queryResult = ctx.ExecuteStoreQuery<int>(nativeSQLQuery);
int count = (
    from tag in context.Tags
    where userSelectedTags.Contains(tag)
    from v in tag.Vacancies
    select v).Count();