2011-02-08 80 views
0

我想使用我的LINQ到SQL查询之一的编译查询。该查询包含5到6个连接。我能够创建编译查询,但我面临的问题是我的查询需要检查密钥是否在作为输入传递的密钥集合中。但编译查询不允许传递集合(因为集合可能有不同数量的项目因此不允许)。LINQ到SQL编译查询帮助

例如

输入到功能是键的集合。你说: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; 

上面的查询没有编译,因为它正在采取列表作为一个输入。是否有任何解决方法或更好的方式来做到上述?

+0

你可以使用常规查询而不是编译的吗? – Gabe 2011-02-09 07:44:25

回答

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为了保持一般性,不处理事物列表,并将所有传递给列表中每个条目的列表转换为参数。