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に等しく、バージョンがDBで最大の数値であるかどうかを知る必要がある場合、どうすれば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.3」よりも「1.11」を優先します。

これが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 に答える