我想在我的表中插入一个名为'S‘的列,它将根据从表列获得的值获得一些字符串值。
例如:for each ID (a.z),我想获取存储在另一个表中的字符串值。字符串值是从另一个通过Linq查询获得它的方法返回的。
这是我需要得到的信息的结构:
a.z是表#1中第一个方框中的ID,从这个ID中我在表#2中得到另一个id,从这个id中我可以得到我需要在列'S‘下显示的字符串值。

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’.类型的
发布于 2012-04-02 02:18:42
您必须在Linq-to-Objects上下文中执行您的方法调用,因为在数据库端,方法调用是没有意义的--您可以使用AsEnumerable()来完成--基本上,查询的其余部分将被评估为一个使用Linq-to-Objects的内存集合,并且您可以按照预期使用方法调用:
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() })发布于 2012-04-02 02:15:15
你会想把它分成两个陈述。返回查询的结果(这将击中数据库),然后在单独的步骤中第二次枚举结果,将转换转换为新的对象列表。第二个“查询”不会击中数据库,因此您将能够在其中使用someMethod()。
Linq到实体是一件有点奇怪的事情,因为它使从C#查询数据库的转换非常无缝:但是您必须始终提醒自己,“这个C#将被转换成一些SQL。”因此,您必须扪心自问,“所有这些C#实际上能作为SQL执行吗?”如果它不能--如果你在里面调用someMethod() --你的查询就会有问题。通常的解决办法是把它分开。
(使用.AsEnumerable()的@BrokenGlass的另一个回答基本上是另一种方法。)
发布于 2017-07-04 14:36:43
这是一个老问题,但我看到没有人提到一个“黑客”,它允许在select期间调用方法而不重复。想法是使用构造函数,在构造函数中,您可以任意调用(至少在LINQ和NHibernate中可以很好地工作,不确定LINQ2SQL或EF,但我想应该是一样的)。下面是基准程序的源代码,在我的例子中,重申方法比构造函数方法慢了一倍,我想这并不奇怪--我的业务逻辑是最小的,所以迭代和内存分配很重要。
我也希望有更好的方法,这个或那个不应该尝试在数据库上执行,
// 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();
}
}https://stackoverflow.com/questions/9970100
复制相似问题