首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Linq查询中调用方法

在Linq查询中调用方法
EN

Stack Overflow用户
提问于 2012-04-02 02:00:42
回答 3查看 70.2K关注 0票数 41

我想在我的表中插入一个名为'S‘的列,它将根据从表列获得的值获得一些字符串值。

例如:for each ID (a.z),我想获取存储在另一个表中的字符串值。字符串值是从另一个通过Linq查询获得它的方法返回的。

  • 可以从Linq调用方法吗?
  • 应该在同一个查询中执行所有操作吗?

这是我需要得到的信息的结构:

a.z是表#1中第一个方框中的ID,从这个ID中我在表#2中得到另一个id,从这个id中我可以得到我需要在列'S‘下显示的字符串值。

代码语言:javascript
运行
复制
var q = (from a in v.A join b in v.B
    on a.i equals b.j
    where a.k == "aaa" && a.h == 0
    select new {T = a.i, S = someMethod(a.z).ToString()})
    return q;

导致以下错误的行S = someMethod(a.z).ToString()

无法将“'System.Data.Linq.SqlClient.SqlMethodCall'.”类型的对象转换为‘System.Data.Linq.SqlClient.SqlMethodCall’.类型的

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-02 02:18:42

您必须在Linq-to-Objects上下文中执行您的方法调用,因为在数据库端,方法调用是没有意义的--您可以使用AsEnumerable()来完成--基本上,查询的其余部分将被评估为一个使用Linq-to-Objects的内存集合,并且您可以按照预期使用方法调用:

代码语言:javascript
运行
复制
var q = (from a in v.A join b in v.B
        on a.i equals b.j
        where a.k == "aaa" && a.h == 0
        select new {T = a.i, Z = a.z })
        .AsEnumerable()
        .Select(x => new { T = x.T, S = someMethod(x.Z).ToString() })
票数 71
EN

Stack Overflow用户

发布于 2012-04-02 02:15:15

你会想把它分成两个陈述。返回查询的结果(这将击中数据库),然后在单独的步骤中第二次枚举结果,将转换转换为新的对象列表。第二个“查询”不会击中数据库,因此您将能够在其中使用someMethod()

Linq到实体是一件有点奇怪的事情,因为它使从C#查询数据库的转换非常无缝:但是您必须始终提醒自己,“这个C#将被转换成一些SQL。”因此,您必须扪心自问,“所有这些C#实际上能作为SQL执行吗?”如果它不能--如果你在里面调用someMethod() --你的查询就会有问题。通常的解决办法是把它分开。

(使用.AsEnumerable()的@BrokenGlass的另一个回答基本上是另一种方法。)

票数 13
EN

Stack Overflow用户

发布于 2017-07-04 14:36:43

这是一个老问题,但我看到没有人提到一个“黑客”,它允许在select期间调用方法而不重复。想法是使用构造函数,在构造函数中,您可以任意调用(至少在LINQ和NHibernate中可以很好地工作,不确定LINQ2SQL或EF,但我想应该是一样的)。下面是基准程序的源代码,在我的例子中,重申方法比构造函数方法慢了一倍,我想这并不奇怪--我的业务逻辑是最小的,所以迭代和内存分配很重要。

我也希望有更好的方法,这个或那个不应该尝试在数据库上执行,

代码语言:javascript
运行
复制
// Here are the results of selecting sum of 1 million ints on my machine:
// Name    Iterations      Percent    
// reiterate       294     53.3575317604356%      
// constructor     551     100%

public class A
{
    public A()
    {            
    }

    public A(int b, int c)
    {
        Result = Sum(b, c);
    }

    public int Result { get; set; }

    public static int Sum(int source1, int source2)
    {
        return source1 + source2;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var range = Enumerable.Range(1, 1000000).ToList();

        BenchmarkIt.Benchmark.This("reiterate", () =>
            {
                var tst = range
                    .Select(x => new { b = x, c = x })
                    .AsEnumerable()
                    .Select(x => new A
                    {
                        Result = A.Sum(x.b, x.c)
                    })
                    .ToList();
            })
            .Against.This("constructor", () =>
            {
                var tst = range
                    .Select(x => new A(x, x))
                    .ToList();
            })
            .For(60)
            .Seconds()
            .PrintComparison();

        Console.ReadKey();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9970100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档