LINQ to Entities排序

4

如何使用Entity Framework将此查询转换为linq to entities:

SELECT  customer_id,
    customer_name,
    customer_code
FROM dbo.V_STF_CUSTOMER
WHERE   company_id=@company_id AND
ORDER BY    CASE
            WHEN ISNUMERIC(customer_name)=1 THEN 1
            ELSE 0
        END,
        customer_name

我有这个:

return CUstomers.GetQuery().
            Where(x => x.CompanyId == companyId).
        OrderBy(??This is my problem??);

我不知道如何翻译orderby。有什么想法吗?


您可以使用http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.isnumeric.aspx来了解有关编程的信息。 - Ahmed Magdy
3个回答

8
return Customers.GetQuery().
            Where(x => x.CompanyId == companyId).
        OrderBy(x=> SqlFunctions.IsNumeric(x.customer_name)).
        ThenBy(x=> x.customer_name);

@Oskar:我觉得我们需要将 Where() 的结果转换为 Enumerable。这样,只有 Linq->EF 才能使用 IsNumeric 方法!如果我没记错的话,它应该会报错,说 IsNumeric 与 Linq->Entities 不兼容/不可翻译? - Numan
1
@Oskar:where 返回 IQueryable 并且实现了 IEnumerable,但结果没有计算。它们在执行 select 或 asenumerable 后直接传递到服务器,所以你写的 order by 实际上是在 .net 上进行而不是在 SQL Server 上进行。 - Naor
@Naor,现在检查一下。你可以使用ThenBy。 - Oskar Kjellin
@Naor 不确定,但我认为扩展方法可能会起作用。在您的数据层中定义扩展方法。使其返回IQueryable<Customer>并成为该类的扩展。如果您不想添加对System.Data的引用,我所能想到的唯一方法就是这样。 - Oskar Kjellin
@Oskar:我本来也想说Naor提到的那个,但表达得不够清楚!你之前的IsNumeric实现版本会在.NET端执行并导致运行时异常!你现在的版本才是正确的!干杯;-) - Numan
显示剩余14条评论

1

您可以在查询中使用 SqlFunctions.IsNumeric 来映射到 Sql Server 中的 IsNumeric。

类似于以下内容:

        var results = from c in customers
                      where c.companyId = companyId
                      orderby SqlFunctions.IsNumeric(c.customerName) == 1 ? 1 : 0, c.customerName
                      select new { c.customerId, c.customerName, c.customerCode };

谢谢,第二排序选项使用名称进行排序怎么样? - Naor

0

首先,我认为SQL查询中有些问题。

WHERE   company_id=@company_id AND

为什么要添加 AND

您可以通过使用 SqlFunctions.IsNumeric 在 Entity Framework 中实现 ISNUMERIC(而不是 Linq to SQL)

return CUstomers.GetQuery().
            Where(x => x.CompanyId == companyId).
            OrderBy(x => SqlFunctions.IsNumeric(x.customer_name)).
            ThenBy(x => x.customer_name);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接