gpt4 book ai didi

linq - 如何使用 Linq 和 Entity Framework 连接两个可连接对象?

转载 作者:行者123 更新时间:2023-12-02 08:51:48 26 4
gpt4 key购买 nike

我有一个非常规范化的数据库,我正在尝试将两个连接表连接在一起。

我的目标是只显示用户有权访问的文档。我正在使用 Entity Framework ,并为下表设置了几个外键:

关系(外键)

Users  --------------------------------------------- 
|
UserGroupMembership (UserID, GroupID)
|
|
Groups ----- -------------------------------------------------|
|
|
|---------------------------------------------------------|
|
|
XDocuments XDocumentSecurity (DocumentID, GroupID)
| |
---------------------------------------------

表定义

public partial class Users : EntityObject  
{
public int UserID {get;set;} //PK
public string UserDisplayName {get;set;}
public DateTime CreateDate {get;set;}
public DateTime LoginDate {get;set;}
}

public partial class Groups : EntityObject
{
public int GroupID {get;set;} //PK
public string GroupDisplayName {get;set;}
public DateTime CreateDate {get;set;}
public DateTime LoginDate {get;set;}
}


public partial class UserGroupMembership: EntityObject // JoinTable
{
public int UserID {get;set;} //PK
public int GroupID {get;set;} //PK

// Not sure if this extra columns below causes an issue
public bool CanView {get;set;}
public bool CanDelete {get;set;}
public bool CanUpdate {get;set;}
public DateTime CreateDate {get;set;}
}

public partial class XDocumentSecurity : EntityObject // JoinTable
{
public int DocumentID {get;set;} //FK
public int GroupID {get;set;} //FK

public DateTime CreateDate {get;set;} // Not sure if this extra column causes an issue
}

public partial class XDocuments : EntityObject
{
public int DocumentID {get;set;} //PK
public string URL {get;set;}
public DateTime CreateDate {get;set;}
}

我听说过很多关于 Linq to EF 如何以次优性能更改 SQL 查询的故事。

这里是 is the .Union operator sample这似乎最适用于我正在做的事情。我可以简单地获取当前用户所属的组列表,并发出此查询的修改版本:

public void Linq50() 
{
int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };
int[] numbersB = { 1, 3, 5, 7, 8 };

var commonNumbers = numbersA.Intersect(numbersB);

Console.WriteLine("Common numbers shared by both arrays:");
foreach (var n in commonNumbers)
{
Console.WriteLine(n);
}
}

问题

  • How do I view the SQL query that EF generates?
  • What is a better way to approach this problem (if any)

最佳答案

您还可以使用任一方法查看 EF 4.1 生成的 SQL

虽然,此时,您需要使用 LINQPad beta对于 EF 4.1。

关于你的第二个问题,我相信你的查询会翻译得很好。使用LINQPad查SQL,查询如下

var a1 = Addresses.Where(a => a.City.ToUpper().EndsWith("L")).Select(a => a.AddressID);
var a2 = Addresses.Where(a => a.City.ToUpper().StartsWith("B")).Select(a => a.AddressID);

var x1 = a1.Intersect(a2);

翻译成

SELECT 
[Intersect1].[AddressID] AS [C1]
FROM (SELECT
[Extent1].[AddressID] AS [AddressID]
FROM [Person].[Address] AS [Extent1]
WHERE UPPER([Extent1].[City]) LIKE N'%L'
INTERSECT
SELECT
[Extent2].[AddressID] AS [AddressID]
FROM [Person].[Address] AS [Extent2]
WHERE UPPER([Extent2].[City]) LIKE N'B%') AS [Intersect1]

我认为@Slauma 的建议是使用导航属性,如果您的模型支持它的话。

仍然,获取 LINQPad - 你不会后悔的:)

关于linq - 如何使用 Linq 和 Entity Framework 连接两个可连接对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8016773/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com