-1

以下代码不起作用:

var x = from user in db.tblUsers
        select new
        {
            user.Id,
            user.FirstName,
            user.LastName,
            NumOfWins = SqlFactory.GetNumberOfWinsByUser(user.Id)
        };

TblBindingSource.DataSource = x.OrderByDescending(user => user.NumOfWins);
dataGridView1.DataSource = TblBindingSource.DataSource; //<-- fail here

错误:

方法“Int32 GetNumberOfWinsByUser(Int32)”不支持对 SQL 的转换。

我知道这会SqlFactory.GetNumberOfWinsByUser(user.Id)带来很好的价值。谁可以帮我这个事?提前致谢。

4

2 回答 2

2

答案在错误中。您显然正在使用 linq 提供程序,例如将您的 linq 转换为 SQL 的实体框架。它无法将方法 SqlFactory.GetNumberOfWinsByUser(user.Id) 转换为 SQL 语句。如果你想使用它,你将不得不做类似的事情:

from user in db.tblUsers.ToList()
          select new { user.Id, user.FirstName, user.LastName, NumOfWins =     SqlFactory.GetNumberOfWinsByUser(user.Id) };

这将迫使它首先将数据提取到内存中,然后在您的 select 语句中应用转换。

我怀疑上面的方法效率很低,但这只是一个猜测。

于 2013-03-05T14:14:32.850 回答
0

有一种方法可以将这种函数嵌入到 Linq2SQL 查询中,前提是您的函数(GetNumberOfWinsByUser()在您的情况下)本身可以编写为Expression<Func<>>表达式可以由提供程序转换为 SQL 的类型

这是由 Tomáš Petříček 设计并在他的博客中描述的:

http://tomasp.net/blog/dynamic-linq-queries.aspx

它解释了如何定义表达式:

Expression<Func<Nwind.Product, decimal?>> calcPrice = 
  (p) => p.UnitPrice * 1.19m;

然后将其嵌入到 Linq to SQL 查询中:

var q = 
   from p in db.Products.ToExpandable()  
   where calcPrice.Expand(p) > 30.0m
   select new { 
     p.ProductName, 
     OriginalPrice = p.UnitPrice,
     ShopPrice = calcPrice.Expand(p) };

使用他创建的扩展方法ToExpandable()(代码可供下载)。

这允许将整个查询解析为 SQL 并在数据库服务器上执行,而无需将任何部分结果集具体化到内存中。它应该非常高效,可以用来处理非常复杂的查询。我通常发现将逻辑封装到表达式中会导致代码简单且可重用性好。

我在一个项目中广泛使用了它,并且效果很好。但是,您需要很好地掌握表达方式。

于 2013-03-05T14:40:47.873 回答