繁体   English   中英

如何在联接表上使用LINQ?

[英]How to use LINQ on a join table?

我试图在LINQ中复制的查询是:

SELECT count(*) FROM joinTable WHERE object1ID = input_parameter1_from_code 
AND object2ID = input_parameter2_from_code;

我可以访问IdentityDbContext,但是它仅包含对组成对象表的引用,而不是对联接表本身的引用,因此我不知道要查找什么才能尝试获得结果。

另外,如果我只能使用这个原始查询,我也想知道如何做。 谢谢。

我假设您已经考虑many-to-many具有隐式“ link”(“ join”,“ junction”)表many-to-many关系。 这样的事情(很可能您是在讲UserRole ,但这不是必需的):

public class One
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Two> Twos { get; set; }
}

public class Two
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<One> Ones { get; set; }
}

public class MyDbContext : DbContext
{
    public DbSet<One> Ones { get; set; }
    public DbSet<Two> Twos { get; set; }
}

尽管您无法直接访问链接表,但是可以将两个“主”表中的任何一个与另一个的导航属性结合使用。

所以,给定

var db = new MyDbContext();

int count =
    (from one in db.Ones
     from two in one.Twos
     where one.Id == input_parameter1_from_code && two.Id == input_parameter2_from_code
     select new { one, two })
     .Count();

int count =
    (from two in db.Twos
     from one in two.Ones
     where one.Id == input_parameter1_from_code && two.Id == input_parameter2_from_code
     select new { one, two })
     .Count();

将产生与以下类似的相同SQL查询:

SELECT
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT
        COUNT(1) AS [A1]
        FROM [dbo].[TwoOne] AS [Extent1]
        WHERE (1 = [Extent1].[One_Id]) AND (2 = [Extent1].[Two_Id])
    )  AS [GroupBy1]

如您所见,它与链接表相对。

在查询语法中:

var amount = (from record in DBcontext.joinTable
              where record.object1ID = input_parameter1_from_code &&
                    record.object2ID = input_parameter2_from_code
              select record).Count();

在Method语法中:

var amount = DBcontext.joinTable
                      .Where(record => record.object1ID = input_parameter1_from_code &&
                                       record.object2ID = input_parameter2_from_code)
                      .Count();

您可以使用Database.SqlQuery方法,该方法接受原始sql查询以及您需要在查询中使用的sql parameter ,使用sql parameter好处是可以避免sql injection

尝试这样:

var data = yourContext.Database.SqlQuery<int>(
    "SELECT count(*) FROM joinTable WHERE object1ID = @code1 AND object2ID = @code2",
    new SqlParameter("@code1", input_parameter1_from_code),
    new SqlParameter("@code2", input_parameter2_from_code)
);

让我知道这是否对您不起作用:)

您绝对可以在DbContext中使用该查询。 在这里查看MSDN文档:

https://msdn.microsoft.com/zh-CN/library/system.data.linq.datacontext.executequery(v=vs.110).aspx

它将类似于:

var Count = DbContext.ExecuteQuery("SELECT count(*) FROM joinTable where object1ID = input_parameter1_from_code 
AND object2ID = input_parameter2_from_code;");

即使链接表也可以使用

dbContext.CollectionOne.where(x => x.Id ==  1).SelectMany(x => x.Collection2).where(y => y.Id == 2).Count()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM