1

私はLINQ式を持っています:

        var users = db.Relationships.Where(i => i.RelationshipId== relId)
            .Select(s => s.User).Distinct().Select(s => new UserViewModel() {
            Username = s.Username,
            LastActiveDateTime = s.LastActive, // DateTime, I want it to be a string filtered through my custom GetFriendlyDate method
        }).ToList();

        // convert all DateTimes - yuck!
        foreach (var userViewModel in users) {
            userViewModel.LastActive = DateFriendly.GetFriendlyDate(userViewModel.LastActiveDateTime);
        }

このソリューションは機能していますが、間違っていると感じます

  • usersすべてのプロパティを再フォーマットするために、データベースからそれらを取得した後、すべてを反復する必要があります
  • 後で文字列に変換して二度と触れないように、ViewModel に DateTime プロパティを設定します。

GetFriendlyDateメソッドをクエリ内で直接使用する方法はありますか?

4

4 に答える 4

2

言及する価値のある可能な解決策:

次のような変換された文字列を返す、ViewModelの getterプロパティを用意します。

public string LastActive
{
    get
    {
        return DateFriendly.GetFriendlyDate(LastActiveDateTime);        
    }
}

既存の LastActiveDateTime 列に関する問題は解決しませんが、変換は使用時にのみ適用されます (ビューでは、おそらく - とにかく、クエリの後半で使用しようとすると、既にわかっている理由で機能しません)であるため、手動で繰り返す必要はありません。

サーバー側でデータを変換するView を作成します。したがって、データは必要な形式で既に返されます。DBFirst を使用している場合は、おそらく最も簡単で最速のソリューションです。

最後に、新しい ViewModel() を選択する前に(または AsEnumerable() を呼び出すか、クエリを具体化する他の方法を見つけて) ToList() を 2回使用することができます。データベースからデータをフェッチし、ToList() の後にクエリで直接必要な C# 側の関数を実行できるようにします。しかし、前に述べたように、ToList() までの条件に一致するすべてのデータを取得することが重要です。ほとんどの場合、これは適切な解決策ではありません。

そして、ここにいくつかの追加の読みがあります:

Linq to Entities クエリでローカル メソッドを呼び出すにはどうすればよいですか?

于 2013-11-09T21:27:57.673 に答える
0

LINQpad でテストしたところ、動作しました。ユーザーを (LINQ を使用して) 繰り返し処理しますが、ビューモデル クラスに DateTime プロパティを追加する必要はありません。また、Automapper を使用して、Users のコレクションを UserViewModel オブジェクトのコレクションに変換することもできます。もちろん、ユーザーを繰り返し処理しますが、表示されません。

もちろん、データベースがないため、いくつかのセットアップ コードを作成する必要がありました。

void Main()
{
        var db = new List<User> { 
            new User { LastActive = DateTime.Now, Username = "Adam", Lastname = "Nowak" },
            new User { LastActive = DateTime.Now.AddYears(1), Username = "Eve", Lastname = "Kowalska"}
        };

        // select only properties that you need from database
        var users = db
            .Select(user => new { Username = user.Username, LastActive = user.LastActive})
            .Distinct()
            .ToList();

        var usersVM = from u in users
        select new UserViewModel { Username = u.Username, LastActiveDateTime = DateFriendly.GetFriendlyDate(u.LastActive)};

        usersVM.Dump();
}

        class User
        {
            public DateTime LastActive;
            public string Username;
            public string Lastname;
        };
        class UserViewModel
        {
            public string Username;
            public string LastActiveDateTime;
        }

        static class DateFriendly
        {
            public static string GetFriendlyDate(DateTime date)        
            {
                return "friendly date " + date.Year;
            }
        }

そして、これは出力します

ユーザー名 LastActiveDateTime

Adam 親善試合 2013

2014年イブフレンドリーデート

于 2013-11-09T21:25:04.563 に答える
-1

LINQ で使用できる直接の Concert.ToDate メソッドはありません。ただし、SqlFunctions クラスの DateAdd メソッドを使用してみることができます。

var users = db.Relationships.Where(i => i.RelationshipId== relId)
    .Select(s => new 
    {
        s.User.Username,
        LastActive=SqlFunctions.DateAdd("d",0, s.LastActive)
    })
    .ToList().Select(s => new UserViewModel()
    {
        Username = s.Username,
        LastActiveDateTime = s.LastActive
    });
于 2013-11-10T09:56:38.103 に答える
-2

以下はうまくいきませんか?

var users = db.Relationships.Where(i => i.RelationshipId== relId)
        .Select(s => s.User).Distinct().Select(s => new UserViewModel() {
        Username = s.Username,
        LastActiveDateTime = DateFriendly.GetFriendlyDate(s.LastActive)        
    }).ToList();
于 2013-11-09T21:11:46.740 に答える