web-dev-qa-db-ja.com

Entity Frameworkを使用して複数の列を選択する

簡単な質問かもしれませんが、簡単に見つけられないので許してください=)複数の列を選択しようとしています。私が使用するステートメントは次のとおりです。

var dataset2 = from recordset in entities.processlists 
               where recordset.ProcessName == processname 
               select recordset.ServerName, recordset.ProcessID, recordset.Username;

明らかに、これはコンパイルすらしません。正しい構文は何ですか?私はまた、メソッドベースを試しましたが、この構文にアクセスすると、「匿名型」を型「AIM.PInfo」にキャストできませんでしたときに、この構文は正しいようです。 LINQ to Entitiesは、EDMプリミティブまたは列挙型のキャストのみをサポートしています。例外。

何か案は?

var dataset = entities.processlists
             .Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart)
             .Select(x => new { x.ServerName, x.ProcessID, x.Username })
             .Cast<PInfo>().ToList();
49
Ronald

実際、コンパイラーはこの匿名型(new { x.ServerName, x.ProcessID, x.Username }部分)をPInfoオブジェクトに変換する方法を知りません。

var dataset = entities.processlists
    .Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart)
    .Select(x => new { x.ServerName, x.ProcessID, x.Username }).ToList();

これにより、後で使用できる(匿名型の)オブジェクトのリストが得られますが、それを返したり、別のメソッドに渡したりすることはできません。

PInfoオブジェクトに適切なプロパティがある場合、次のようになります。

var dataset = entities.processlists
    .Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart)
    .Select(x => new PInfo 
                 { 
                      ServerName = x.ServerName, 
                      ProcessID = x.ProcessID, 
                      UserName = x.Username 
                 }).ToList();

PInfoに少なくともこれらの3つのプロパティがあると仮定します。

どちらのクエリでも必要な列のみをフェッチできますが、既存のタイプ(2番目のクエリのように)を使用すると、このデータをアプリの他の部分に送信できます。

93
Réda Mattar

たとえば、匿名タイプを選択できます

var dataset2 = 
    (from recordset in entities.processlists 
    where recordset.ProcessName == processname 
    select new
    {
        serverName = recordset.ServerName,
        processId = recordset.ProcessID, 
        username = recordset.Username
    }).ToList();

または、選択を表す新しいクラスを作成できます。たとえば、

public class MyDataSet
{
    public string ServerName { get; set; }
    public string ProcessId { get; set; }
    public string Username { get; set; }
}

次に、例えば次のことができます

 var dataset2 = 
    (from recordset in entities.processlists 
    where recordset.ProcessName == processname 
    select new MyDataSet
    {
        ServerName = recordset.ServerName,
        ProcessId = recordset.ProcessID, 
        Username = recordset.Username
    }).ToList();
17
Andre Lombaard

.Selectに新しいオブジェクトを作成してみませんか:

.Select(x => new PInfo{ 
    ServerName = x.ServerName, 
    ProcessID = x.ProcessID, 
    UserName = x.Username }).ToList();
5
tmp001

匿名タイプを選択する必要があります。

var dataset2 = from recordset 
               in entities.processlists 
               where recordset.ProcessName == processname 
               select new 
               {
                recordset.ServerName, 
                recordset.ProcessID, 
                recordset.Username
               };

しかし、それを別の型にキャストすることはできないので、次のようなものが欲しいと思います。

var dataset2 = from recordset 
               in entities.processlists 
               where recordset.ProcessName == processname 

               // Select new concrete type
               select new PInfo
               {
                ServerName = recordset.ServerName, 
                ProcessID = recordset.ProcessID, 
                Username = recordset.Username
               };
3
CodeCaster

指定されたタイプのデータを取得する正しい方法です:

var dataset = entities.processlists
         .Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart)
         .Select(x => new { x.ServerName, x.ProcessID, x.Username })
         .ToList() /// To get data from database
         .Select(x => new PInfo()
              { 
                   ServerName = x.ServerName, 
                   ProcessID = x.ProcessID, 
                   Username = x.Username 
              });

詳細については、以下を参照してください。 エンティティはLINQ to Entitiesクエリで構築できません

var test_obj = from d in repository.DbPricing
join d1 in repository.DbOfficeProducts on d.OfficeProductId equals d1.Id
join d2 in repository.DbOfficeProductDetails on d1.ProductDetailsId equals d2.Id
    select new
    {
    PricingId = d.Id,
    LetterColor = d2.LetterColor,
    LetterPaperWeight = d2.LetterPaperWeight
    };


http://www.cybertechquestions.com/select-across-multiple-tables-in-entity-framework-resulting-in-a-generic-iqueryable_222801.html
1
Ilker Eker