Entiity Framework 7 / LINQ - timespanオブジェクトの合計を取得する

c# entity-framework entity-framework-core sum timespan

質問

私はVS2015で、新しいasp.netとEntity Framework 7のRCを使って新しいWebアプリケーションを構築しようとしています。

私が表示できるようにしたいのは、「時間の合計」列です。

私はアップロードされたすべてのビデオデータの合計時間を取得できる方法を見つけようとしています(ファイルからメディア情報を取得するためにNRecoとFFProbeを使用しています。 DBにアップロードする)

ビデオデータをデータベースにアップロードするとき、 ビデオモデルのプロパティの1つがTimeSpanオブジェクトです。

私はしばらくの間、ネットをトロールしてきました。私が試した解決策のいくつかはうまくいきませんでした。

コンテキストについては、ここに私のモデルです

public class Video
{
    public int Id { get; set; }
    public DateTime DateOfVideo { get; set; }
    public string Road { get; set; }
    public string RegistrationNumber { get; set; }
    public List<Keyword> Keywords { get; set; }
    public TimeSpan VideoDuration { get; set; }
    public string User { get; set; }
    public DateTime UploadDate { get; set; }
}

と私のコントローラ

public class HomeController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly IHostingEnvironment _environment;
    private readonly CcContext _context;

    public HomeController(UserManager<ApplicationUser> userManager, IHostingEnvironment environment, CcContext context)
    {
        _userManager = userManager;
        _environment = environment;
        _context = context;
    }
    ... 
    Various controller actions and methods removed for brevetiy 
    ...
}

私がこれまでに試したこと

このSOの答えに基づいて

 var minutesOfVideo = new TimeSpan(_context.Videos.Sum(v => v.VideoDuration.Ticks)); 

しかし、

EntityFramework.Core.dllで 'System.InvalidCastException'型の例外が発生しましたが、ユーザーコードで処理されませんでした

追加情報:指定されたキャストは無効です。

私もこれをやろうとした

var minutesOfVideo  = _context.Videos.Aggregate(TimeSpan.Zero, (sumSoFar, nextMyObject) => sumSoFar + nextMyObject.VideoDuration);

しかし、これは

EntityFramework.Core.dllで 'System.NotImplementedException'タイプの例外が発生しましたが、ユーザーコードで処理されませんでした

追加情報:Remotion.Linq.Clauses.ResultOperators.AggregateFromSeedResultOperator

これも可能ですか、私はいくつかのLinq - > SQLまたはいくつかのネイティブSQL

これが可能なのであれば、私はどんな答えにも感謝します。

EDIT

@リッキーの提案(途中で感謝)に基づいて、

試してみたら

var minutesOfVideo = _context.Videos.Select(v => v.VideoDuration).ToArray();

はEntityFramework.Core.dllで 'System.InvalidCastException'タイプが発生しましたが、ユーザコード処理されませんでした

var minutesOfVideo = _context.Videos.Select(v => v.VideoDuration).ToArray().Sum();

コンパイラエラーが発生する

'TimeSpan []'に 'Sum'の定義が含まれておらず、最適な拡張メソッドオーバーロード 'AsyncEnumerable.Sum(IAsyncEnumerable)'に 'IAsyncEnumerable'タイプのレシーバが必要です

私は私のビデオモデルからtimespanのプロパティを削除し、それを2つのintの時間と分に置き換える価値があるかどうか疑問に思っています...

受け入れられた回答

そこで、2つの新しいプロパティを使用してビデオモデルを編集するアプローチをとった

public int VideoMinutes { get; set; }
public int VideoSeconds { get; set; }

NReco.GetMediaInfoからTimeSpanオブジェクトを取得しました。作成したTimeStampオブジェクトのプロパティとして2つの新しいフィールドを設定しています。

それは私のHomeControllerで次のことをすることができます

        var totalMinsOfVideo = _context.Videos.Select(v => v.VideoMinutes).Sum();
        var totalSecsOfVideo = _context.Videos.Select(v => v.VideoSeconds).Sum();
        var total = new TimeSpan(0, totalMinsOfVideo, totalSecsOfVideo);

それは最もクリーンな解決策ではないかもしれませんが、これが私に現在必要なものを提供しています。


人気のある回答

通常、EF 7はLINQ式をSQL文に変換しようとします。データベースクエリとクラスプロパティのアクセスを組み合わせた機能は限られていますが、

私は、あなたがデータベースからすべてのVideoDurationを照会することをお勧めしますToArrayは、配列の上で合計を呼び出します:

_context.Videos.Select(v => v.VideoDuration)
    .ToArray()
    .Select(vd => vd.TotalMinutes)
    .Sum() // the return value is of type double


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ