. Net - Linq to SQL - Аренда на уровне строк - PullRequest
0 голосов
/ 18 апреля 2020

У нас есть мультитенантная база данных на уровне строк. Предыдущее приложение было разработано с использованием 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);
}

Но это конкретное приложение использует DBML, LINQ to SQL, где наследующий класс DbContext не работает. Большинство примеров здесь основаны на EF, а не на LINQ To SQL.

. Оцените, как этого добиться, используя LINQ To SQL, или мне лучше изменить этот EF?

1 Ответ

0 голосов
/ 18 апреля 2020

Один из способов генерации оператора SQL из LINQ, вам нужно передать в IQueryable<Tuple<T, int>> Таким образом, LINQ на 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;

}


Вы можете проверить здесь , просто обновите свои переменные и верните объекты. Мне пришлось удалить некоторый код из моего образца

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...