具有动态表名的WHERE子句的LINQ查询

时间:2016-02-20 12:20:04

标签: c# linq

我目前有一个表,用于保存客户端正在同步哪些行的数据。我用它是这样的:

var syncRows = context.SynchronizingRows.Where(r => r.ClientId == clientId).Select(r => r.RowId);
return context.Customers.Where(c => syncRows.Contains(c.Id)).ToList();
// I have lots of tables to return, but the syncRows statement is always the same 
// (my Id's are GUID's, so they don't overlap)

我现在想要拆分该表并为每个客户端创建一个单独的表。问题是,我无法弄清楚如何从字符串中动态指定表。

我可以使用 ExecuteQuery 并手动编写整个查询:

return context.ExecuteQuery<Customer>("SELECT * FROM Customers WHERE Id IN (SELECT ...);");

但是这种方式我失去了所有静态输入,智能感知等等。基本上是维护噩梦。

因为所有同步表都具有完全相同的定义 - CREATE TABLE Test1 (RowId [uniqueidentifier] NOT NULL); - 我最好使用这个伪代码:

public Interface ISync // can be a class as well...
{
   Guid RowId { get; set; }
}

IQueryable<ISync> syncRows = context.GetTable<ISync>("Test1");
return context.Customers.Where(...).ToList();

我的想法是指定表名 Test1 ,数据类型和其他所有内容都像之前一样。

我的问题是 - 如何实现这一目标?

NB!
1)你不能通过var syncRows = context.ExecuteQuery<ISync>("SELECT * FROM Test1");作弊 - 因为这会破坏用于选择客户的SQL查询。 (Contains()如果从c#侧传入值,则限制为2100项,因此 Contains 部分必须作为SQL语句集成到SQL查询本身 - 这意味着{{1} }必须是syncRows

2)Dynamic LINQ Library不起作用 - IQueryable - 抛出异常,抱怨它无法处理 SELECT 。 (虽然我不介意只手写Where语句)

3)没有LINQ-To-Entities !!只有 LINQ-To-SQL

4)我思考在第1点选择context.Customers.Where("Id IN (SELECT ...)")并通过表值参数传递它们的想法,但是: a)唉 - LINQ to SQL不支持TVP&#39; b)甚至没有存储过程
c)即使我可以(比如作为XML参数),将整个Id的列表从c#侧传递到SQL端50多次(许多表同步)可能会影响性能。此外,我必须手动为每个表编写每个存储过程 - 再次没有静态类型,没有智能感知......

使用c#,. NET 4.5,SQL 2014

0 个答案:

没有答案