4

我正在尝试在 C# 中获取最新版本的程序。下面的代码是我能够让代码在我的控制器中运行而没有任何错误的唯一方法:

PList = PList.Where(x => x.PSP == LP && x.VERSION == "1.3");

问题是,除非我在每个新版本中都维护此代码并将代码中的代码更正为最新版本,否则它将无法正常工作。

所以我认为我可以使用max函数来获取最新版本,但它是 SQL DB 中的 varchar,我无法更改它,因为我无权访问更改类型。

我已经尝试了不同的方法来做到这一点,比如下面的例子,但没有运气。

PList = PList.Where(x => x.PSP == LP && x.VERSION.MAX());

运算符“&&”不能应用于“bool”和“char”类型的操作数

那么当我需要知道 PSP 是否等于 LP并且版本是数据库中的最高数字时,如何获得 Max 版本?感谢您的帮助!

更新

谢谢大家的出色回答,我可以看到他们中的一些人可能如何独立工作,但他们都没有使用我拥有的代码。我认为发布其余代码可能有助于更轻松地诊断问题,所以这里是其余代码。

public virtual ActionResult getAjaxP(string TP = null)
{
    if (TP != null)
    {
        var PList = from x in db.iamp_mapping select x;
        PList = PList.Where(x => x.PSP == TP);
        return Json(PList.Select(x => new { x.PS }).Distinct().ToArray(), JsonRequestBehavior.AllowGet);
    }
    return View();
}
4

3 回答 3

4

不幸的是,您的版本号存储为文本。这意味着“1.11”实际上早于“1.3”。

除此之外,您可以使用OrderByDescending. 例如

var item = PList.Where(x => x.PSP == LP)
                .OrderByDescending(x => x.VERSION)
                .First();

这将获得具有最高版本号的单个项目。如果有多个项目与该版本号匹配,它会变得有点棘手 - 您可能希望按版本分组,然后按组键排序。基本上我们需要更多关于你想要达到的目标的信息。

于 2012-08-22T21:28:12.877 回答
4

您可以利用System.Version类。

var maxVersion = PList
    .Select(x => new Version(x.VERSION))
    .Max()
    .ToString();

PList = PList.Where(x => x.PSP == LP && x.VERSION == maxVersion);

例如,这将有利于“1.11”而不是“1.3”。

如果这是 Linq-to-Sql,它可能涉及对数据库的额外调用。

于 2012-08-22T21:53:48.017 回答
1

试试这个

 var Max_VERSION = (from x in PList where x.PSP == LP select x.VERSION).Max();

简单的例子:

string[] versions = {"1.3","1.8","4.1","1.9", "1.4", "0.5", "1.7" };
           var max_VeRsion = (from p in versions select p).Max();

哎呀:

 string[] versions = {"1.3","1.8","4.2","1.9", "4.11", "0.5", "1.17" };

        var mv = (from p in versions
                 let m = versions.Max().Split(Convert.ToChar(".")).First()
                 let n = (from q in versions
                          where q.Split(Convert.ToChar(".")).First() == m
                          select Convert.ToInt32(q.Split(Convert.ToChar(".")).Last())).Max().ToString()
                 where
                     p.Split(Convert.ToChar(".")).First() == m && p.Split(Convert.ToChar(".")).Last() == n
                 select p).First();

最后一次尝试:)

        string max_version_work = (from q in
                                       (from p in versions
                                        select new
                                        {
                                            Ma = Convert.ToInt32(p.Split('.').First())
                                            ,
                                            Mi = Convert.ToInt32(p.Split('.').Last())
                                        })
                                   orderby q.Ma descending, q.Mi descending
                                   select string.Format("{0}.{1}", q.Ma, q.Mi)).FirstOrDefault();
于 2012-08-22T21:41:33.707 回答