gpt4 book ai didi

c# - LINQ to Entities/LINQ to SQL : switching from server (queryable) to client (enumerable) in the middle of a query comprehension?

转载 作者:可可西里 更新时间:2023-11-01 08:54:11 26 4
gpt4 key购买 nike

在许多情况下,我想在服务器端进行一些过滤(有时是投影),然后切换到客户端以执行 LINQ 提供程序本身不支持的操作。

天真的方法(这基本上就是我现在所做的)是将其分解为多个查询,类似于:

var fromServer = from t in context.Table
where t.Col1 = 123
where t.Col2 = "blah"
select t;

var clientSide = from t in fromServer.AsEnumerable()
where t.Col3.Split('/').Last() == "whatever"
select t.Col4;

但是,很多时候,这带来的代码/麻烦多于它的实际值(value)。我真的很想在中间做一个“切换到客户端”。我已经尝试了各种使用查询延续的方法,但是在第一个查询结束时执行“select t into foo”之后,foo 仍然是一个单独的项目,而不是集合,所以我不能 AsEnumerable() 它.

我的目标是能够写出更像这样的东西:

var results = from t in context.Table
where t.Col1 = 123
where t.Col2 = "blah"
// Magic happens here to switch to the client side
where t.Col3.Split('/').Last() == "whatever"
select t.Col4;

最佳答案

好的,首先你绝对不应该使用这里的代码。它是由训练有素的特技仓鼠编写的,这些仓鼠受过训练,在处理这种性质的代码时不会呕吐。

您应该绝对选择您知道的选项之一:

  • 使用“临时”变量(如果您可以将该变量静态键入为 IEnumerable<T>,那么您不需要调用 AsEnumerable - 如果您将匿名类型作为元素,那将不起作用类(class)类型)
  • 使用括号调用 AsEnumerable
  • 使用“流利”或“点符号”语法制作 AsEnumerable呼唤适应。

但是,您可以使用查询表达式的翻译方式来施展魔法。您只需要使在查询表达式中具有不同表示的标准查询运算符之一具有不同的翻译。这里最简单的选项可能是“Where”。只需使用 IQueryable<T> 编写您自己的扩展方法即可和一个 Func<T, SomeType>其中 SomeType不是 bool ,而你离开了。这是一个示例,首先是 hack 本身,然后是它的示例使用...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

public static class QueryHacks
{
public static readonly HackToken TransferToClient = HackToken.Instance;

public static IEnumerable<T> Where<T>(
this IQueryable<T> source,
Func<T, HackToken> ignored)
{
// Just like AsEnumerable... we're just changing the compile-time
// type, effectively.
return source;
}

// This class only really exists to make sure we don't *accidentally* use
// the hack above.
public class HackToken
{
internal static readonly HackToken Instance = new HackToken();
private HackToken() {}
}
}

public class Test
{
static void Main()
{
// Pretend this is really a db context or whatever
IQueryable<string> source = new string[0].AsQueryable();

var query = from x in source
where x.StartsWith("Foo") // Queryable.Where
where QueryHacks.TransferToClient
where x.GetHashCode() == 5 // Enumerable.Where
select x.Length;
}
}

关于c# - LINQ to Entities/LINQ to SQL : switching from server (queryable) to client (enumerable) in the middle of a query comprehension?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4824367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com