Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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/0/asp.net-mvc/15.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# .Net-Linq到SQL-行级租赁_C#_Asp.net Mvc_Entity Framework_Linq - Fatal编程技术网

C# .Net-Linq到SQL-行级租赁

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

我们有行级多租户数据库。以前的一个应用程序是使用EF和DataContext类开发的,我们设法创建一个在全局级别具有过滤器的类,如下所示

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是一条死胡同。我不认为你测试过这个。我放了一个链接,你测试它,然后用你的变量库更新,但是小提琴不可能运行。不确定您在这里要做什么,但是
连接
甚至无法编译项1等于项是范围变量的错误顺序。内存中列表中的对象如何与LIQ-to-SQL表中新创建的对象相等?更不用说LINQtoSQL不允许与本地序列连接的事实了。在fiddle中,他需要替换DbContext和租户变量。现在,如果您回来阅读他的问题,他正在寻找关于如何执行LINQtoSQL的指针,请欣赏关于如何使用LINQtoSQL实现这一点的指针。代码示例并不完整,但向他展示了他可以通过提供带有元组或Func*的IQueryable来绕过传递对象的障碍。无法使用LINQ to SQL运行且包含语法错误的代码是指向错误方向的指针。