C# .Net-Linq到SQL-行级租赁
我们有行级多租户数据库。以前的一个应用程序是使用EF和DataContext类开发的,我们设法创建一个在全局级别具有过滤器的类,如下所示C# .Net-Linq到SQL-行级租赁,c#,asp.net-mvc,entity-framework,linq,C#,Asp.net Mvc,Entity Framework,Linq,我们有行级多租户数据库。以前的一个应用程序是使用EF和DataContext类开发的,我们设法创建一个在全局级别具有过滤器的类,如下所示 public EFDbContext(int tenantID = 0) : base("name=WMSEntities") //Constructor of the class always expect a tenantID { //tenantID = int.Parse(System.Security.Claims.ClaimsPri
public EFDbContext(int tenantID = 0) : base("name=WMSEntities") //Constructor of the class always expect a tenantID
{
//tenantID = int.Parse(System.Security.Claims.ClaimsPrincipal.Current.FindFirst("tenantid").Value);
//Here, the Dbset can expose the unfiltered data
Tenants = new FilteredDbSet<Tenant>(this);
//From here, add all the multitenant dbsets with filtered data
Items = new FilteredDbSet<Item>(this, d => d.TenantID == tenantID);
}
public-EFDbContext(int-tenantID=0):base(“name=wmsenties”)//类的构造函数始终需要一个tenantID
{
//tenantID=int.Parse(System.Security.Claims.ClaimsPrincipal.Current.FindFirst(“tenantID”).Value);
//这里,Dbset可以公开未过滤的数据
租户=新的过滤器设置(此);
//从这里,添加所有具有过滤数据的多租户数据库集
Items=newfiltereddbset(this,d=>d.TenantID==TenantID);
}
但是这个特定的应用程序使用的是DBML、LINQ到SQL,继承的DbContext类在这里不起作用。这里的大多数示例都基于EF而不是linqtosql
欣赏关于如何使用LINQ to SQL实现这一点的指针,或者我最好更改此EF?从LINQ生成SQL语句的一种方法是,您需要传入一个
IQueryable
,这样LINQ to SQL知道如何将其转换为SQL:
我将用这个替换您的基类和存储库
// Repository/Generic base class
using System;
using System.Collections;
using System.Linq;
public IQueryable<T> TenantFilteredContext(
IQueryable<Tuple<T, int>> TenantModelRelationIds, string objectType)
{
var tenantObjects =
from tenantRelationRecord in objectTenantRelationRepo.All()
where tenantRelationRecord.TenantId == Global.TenantId
where tenantRelationRecord.ObjectTypeId == type.TypeId
select tenantObjectRecord;
var result =
from item in this.context.GetTable<T>()
join objectToTenentRelationId in TenantModelRelationIds
on objectToTenentRelationId.Item1 equals item
join tenantObject in tenantObjects
on TenantModelRelationIds.Item2 equals tenantObject.ObjectId
select item;
return result;
//存储库/通用基类
使用制度;
使用系统集合;
使用System.Linq;
公共IQueryable租户FilteredContext(
IQueryable租户模型关系ID,字符串对象类型)
{
var租户对象=
来自objectTenantRelationRepo.All()中的tenantRelationRecord
其中tenantRelationRecord.TenantId==Global.TenantId
其中tenantRelationRecord.ObjectTypeId==type.TypeId
选择租户对象记录;
var结果=
来自this.context.GetTable()中的项
在TenantModelRelationId中加入ObjectToEntertRelationId
在ObjectToEntertRelationId.Item1上等于item
在租户对象中加入租户对象
在TenantModelRelationId.Item2上等于tenantObject.ObjectId
选择项目;
返回结果;
}
您可以进行测试,只需更新变量并返回对象。我不得不从我的示例中删除一些代码迁移到EF总是更好的。LINQ到SQL是一条死胡同。我不认为你测试过这个。我放了一个链接,你测试它,然后用你的变量库更新,但是小提琴不可能运行。不确定您在这里要做什么,但是
连接
甚至无法编译