0

我正在尝试将编译查询用于我的 linq to sql 查询之一。此查询包含 5 到 6 个连接。我能够创建已编译的查询,但我面临的问题是我的查询需要检查密钥是否在作为输入传递的密钥集合中。但是编译的查询不允许传递集合(因为集合可以有不同数量的项目,因此不允许)。

例如

函数的输入是键的集合。说:List<Guid> InputKeys

    List<SomeClass> output = null;
    var compiledQuery = CompiledQuery.Compile<DataContext, List<Guid>, IQueryable<SomeClass>>(
                        (context, inputKeys) => from a in context.GetTable<A>()
                                     where inputKeys.Contains(a.Key)
                                     select a);

   using(var dataContext = new DataContext())
   {
          output = compiledQuery(dataContext, InputKeys).ToList();
   }

   return output;

上述查询无法编译,因为它将列表作为输入之一。是否有任何解决方法或更好的方法来完成上述操作?

4

1 回答 1

0

我不确定这是否可能仅使用 Linq to SQL。我认为您需要在服务器上编写一个存储过程或函数,它可以让您传入一个表示列表的分隔字符串,并解析返回一个表,然后您可以与该表进行比较。

我认为实现这一点的最简单方法是将整个事情编写(或让您的 DBA 编写)作为存储过程,它仍然需要将您的列表作为其参数的字符串,调用上述拆分器函数。存储过程将由服务器预编译其执行计划。

您可以使用 Linq 轻松地将您的列表变成一个字符串,例如

string[] strings = new string[4] { "1", "2", "3", "4" };

string listOfStrings = strings.Aggregate((acc, s) => acc = acc + ", " + s);

您可以将可以转换为字符串的任何内容的列表转换为 IEnumerable 字符串

IEnumerable<string> strings = list.Cast<string>();

然后,您可以将存储过程添加到 dbml 文件并使用 Linq to SQL 调用它。

我似乎记得 Linq to SQL 为了保持通用性,不处理事物列表,并将您传递的所有列表转换为列表中每个条目的参数。

于 2011-02-09T20:45:08.107 回答