Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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/7/sql-server/25.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 6:Can';t生成我想要的查询,是否应该使用本机SQL?_C#_Sql Server_Linq_Entity Framework_Many To Many - Fatal编程技术网

C# EF 6:Can';t生成我想要的查询,是否应该使用本机SQL?

C# EF 6:Can';t生成我想要的查询,是否应该使用本机SQL?,c#,sql-server,linq,entity-framework,many-to-many,C#,Sql Server,Linq,Entity Framework,Many To Many,我有以下两个具有多对多映射的实体: ConferenceRoom {ID, Name, IsAccessibleGlobally} <--- Many-To-Many ---> Department {ID, Name} 以下是我的POCO课程: public class Department { public long Id { get; set; } public string Name { get; set; } public virtual I

我有以下两个具有多对多映射的实体:

ConferenceRoom {ID, Name, IsAccessibleGlobally}  <--- Many-To-Many ---> Department {ID, Name}
以下是我的POCO课程:

public class Department
{
    public long Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<ConferenceRoom> ConferenceRooms { get; set; }
}

public class ConferenceRoom
{
    public long Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Department> Departments { get; set; }
}
生成的sql是:

SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[Nom] AS [Nom], 
    [Extent1].[AccesGlobal] AS [AccesGlobal]
    FROM  [dbo].[Verbalisateur] AS [Extent1]
    CROSS JOIN [dbo].[Verbalisateur] AS [Extent2]
    WHERE ( EXISTS (SELECT 
        1 AS [C1]
        FROM [dbo].[VerbalisateursJuridiction] AS [Extent3]
        WHERE ([Extent2].[ID] = [Extent3].[IdVerbalisateur]) AND (5 = [Extent3].[IdJuridiction])
    )) AND ([Extent1].[ID] = [Extent2].[ID] OR [Extent1].[AccesGlobal] = 1)
我能做些什么来得到一个类似于我想要的查询。另一方面,你们是否建议在使用ORM时使用本机SQL,至少在查询结果时使用本机SQL。多谢各位


编辑 在找不到使用EF 6执行本机SQL查询的方法后,我选择了:

ctx.ConferenceRooms.Where(cf => cf.IsAccessibleGlobally || cf.Departments.Any(d => d.Id == 7))

尽管生成的查询不是我所希望的,但至少代码是可读的。

通常在涉及连接时,尤其是在进行连接时,它应该是一个视图。这将加快查询时间,并明确定义查看数据的方式。我会尽可能多地将本机SQL保存在数据库中。

目前我没有任何方法来测试它,但由于您的查询相当于以下内容(性能应该类似,而且在我看来,对于新手来说更容易理解):

您可以尝试以下LINQ查询(目前我无法测试生成的SQL),该查询应提供与上述类似的查询:

var query =
    ctx.ConferenceRoom
        .Where(cr => cr.IsAccessibleGlobally == 1)
        .Select(cr => new { cr.ID, cr.Name })
        .Concat(
            ctx.Department
                .Where(d => d.Id == 7)
                .Select(d => 
                    d.ConferenceRooms
                    .Where(cr => cr.IsAccessibleGlobally == 0)
                    .Select(cr => new { cr.ID, cr.Name }))
        )
你就快到了:

var rooms = ctx.ConferenceRooms
               .Where(v => v.Departments.Any(d => d.Id == 7)
                        || v.AccesGlobal);
SELECT 
    CR.ID, CR.Name
FROM ConferenceRoom CR
WHERE 
    CR.IsAccessibleGlobally = 1
UNION ALL
SELECT 
    CR.ID, CR.Name
FROM DeptCRMapping DCRM
INNER JOIN ConferenceRoom CR ON DCRM.IDConferenceRoom = CR.ID
WHERE 
    DCRM.IdDepartment = 7
    and CR.IsAccessibleGlobally = 0
var query =
    ctx.ConferenceRoom
        .Where(cr => cr.IsAccessibleGlobally == 1)
        .Select(cr => new { cr.ID, cr.Name })
        .Concat(
            ctx.Department
                .Where(d => d.Id == 7)
                .Select(d => 
                    d.ConferenceRooms
                    .Where(cr => cr.IsAccessibleGlobally == 0)
                    .Select(cr => new { cr.ID, cr.Name }))
        )
var rooms = ctx.ConferenceRooms
               .Where(v => v.Departments.Any(d => d.Id == 7)
                        || v.AccesGlobal);