[英]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
关系。 这样的事情(很可能您是在讲User
和Role
,但这不是必需的):
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.