linq查询 查询表中一个字段的数量,并返回前十个,使用count和top!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linq查询 查询表中一个字段的数量,并返回前十个,使用count和top!相关的知识,希望对你有一定的参考价值。

也可以给一个sql语句查询。急用!
查询用户收藏表中收藏商品最多的前十中商品!

参考技术A 你问问题最好把表结构发出来,这样也节约你的时间。
=================================================
应该类似如下Linq
(
from c in 收藏表上下文
group c by c.产品ID into g
orderby g.Count() descending
select new

A=g.Key,
B=g.Count()

).Take(10)
------------
sql
SELECT TOP (10) [t1].[产品ID] AS [A], [t1].[value] AS [B]
FROM (
SELECT COUNT(*) AS [value],[t0].[产品ID]
FROM [收藏表] AS [t0]
GROUP BY [t0].[产品ID]
) AS [t1]
ORDER BY [t1].[value] DESC追问

表结构是:收藏用户UserID,收藏产品ProductID!

追答

那一个userid可以多次收藏一种产品么?
是否会出现如下数据
userID ProductID
A P101
A P101
A P101
B P102

本回答被提问者采纳

从字符串构建动态LINQ查询 - 使用Reflection?

我有一些单词模板(可能有数千个)。每个模板都有合并字段,这些字段将从数据库中填充。我不喜欢为每个模板编写单独的代码,然后构建应用程序并在模板更改或添加模板上的字段时进行部署!

相反,我试图在一个单独的xml文件中定义所有合并字段,并为每个字段编写我想要编写的“查询”,这将在需要时调用。 EX:

  1. mergefield1将调用查询“Case.Parties.FirstOrDefault.NameEn”
  2. mergefield2将调用查询“Case.CaseNumber”
  3. mergefield3将调用查询“Case.Documents.FirstOrDefault.DocumentContent.DocumentType”
  4. 等等,

因此,对于特定模板,我扫描其合并字段,并且对于每个合并字段,我将其视为“查询定义”,并使用EntityFramework和LINQ将该请求发送到数据库。防爆。它适用于这些查询:“TimeSlots.FirstOrDefault.StartDateTime”或“Case.CaseNumber”

这将是一个引擎,它将生成word文档并用xml中的合并字段填充它。此外,它适用于任何新模板或新合并字段。

现在,我使用反射工作了一个版本。

public string GetColumnValueByObjectByName(Expression<Func<TEntity, bool>> filter = null, string objectName = "", string dllName = "", string objectID = "", string propertyName = "")
    {
        string objectDllName = objectName + ", " + dllName;
        Type type = Type.GetType(objectDllName);
        Guid oID = new Guid(objectID);
        dynamic Entity = context.Set(type).Find(oID); // get Object by Type and ObjectID

        string value = ""; //the value which will be filled with data from database

        IEnumerable<string> linqMethods = typeof(System.Linq.Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public).Select(s => s.Name).ToList(); //get all linq methods and save them as list of strings

        if (propertyName.Contains('.'))
        {
            string[] properies = propertyName.Split('.');
            dynamic object1 = Entity;
            IEnumerable<dynamic> Child = new List<dynamic>();
            for (int i = 0; i < properies.Length; i++)
            {
                if (i < properies.Length - 1 && linqMethods.Contains(properies[i + 1]))
                {
                    Child = type.GetProperty(properies[i]).GetValue(object1, null);
                }
                else if (linqMethods.Contains(properies[i]))
                {
                    object1 = Child.Cast<object>().FirstOrDefault(); //for now works only with FirstOrDefault - Later it will be changed to work with ToList or other linq methods
                    type = object1.GetType();
                }
                else
                {
                    if (linqMethods.Contains(properies[i]))
                    {
                        object1 = type.GetProperty(properies[i + 1]).GetValue(object1, null);
                    }
                    else
                    {
                        object1 = type.GetProperty(properies[i]).GetValue(object1, null);
                    }
                    type = object1.GetType();
                }
            }

            value = object1.ToString(); //.StartDateTime.ToString();
        }

        return value;
    }

我不确定这是不是最好的方法。有没有人有更好的建议,或者有人已经做过这样的事情?

缩短它:想法是从类似于“Case.Parties.FirstOrDefault.NameEn”的字符串对数据库进行泛型linq查询。

答案

你的方法非常好。我毫不怀疑它已经有效了。

另一种方法是使用像@Egorikas建议的表达式树。

免责声明:我是Eval-Expression.NET项目的所有者

简而言之,这个库允许您在运行时评估几乎所有C#代码(您确切想要做什么)。

我建议你改用我的库。保留代码:

  • 更具可读性
  • 更容易支持
  • 增加一些灵活性

public string GetColumnValueByObjectByName(Expression<Func<TEntity, bool>> filter = null, string objectName = "", string dllName = "", string objectID = "", string propertyName = "")
{
    string objectDllName = objectName + ", " + dllName;
    Type type = Type.GetType(objectDllName);
    Guid oID = new Guid(objectID);
    object Entity = context.Set(type).Find(oID); // get Object by Type and ObjectID

    var value = Eval.Execute("x." + propertyName, new { x = entity });
    return value.ToString();
}

该库还允许您使用IQueryable的动态字符串

维基:LINQ-Dynamic

以上是关于linq查询 查询表中一个字段的数量,并返回前十个,使用count和top!的主要内容,如果未能解决你的问题,请参考以下文章

oracle如何查询前十个数据

mysql中排序取第十个数据

linq多表查询,并返回所以字段,注意:不要一个一个列出字段,不要select newa,b返回结果,求高手解答

linq 组查询中的产品销售数量和名称

如何使用一个 linq 查询获得总数量?

C# lambda方式取出前十个经常联系的手机号码